将视图模型传递到函数中

本文关键字:函数 视图 模型 | 更新日期: 2023-09-27 18:26:24

有没有办法将视图模型传递到函数中?

我们有以下代码

Activity a = new Activity();
a.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID;
a.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0;
a.isMember = !(WebSessions.IsCUser); 
a.isUser = (WebSessions.IsCUser);

还有

OpenTask o = new OpenTask();
o.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID;
o.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0;
o.isMember = !(WebSessions.IsCUser); 
o.isUser = (WebSessions.IsCUser);

我想创建一个函数,为我设置这些值

GetValuesForUserORMember(*pass in view model*)
{
    thisView = *pass in view model*
    thisView.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID;
    thisView.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0;
    thisView.isMember = !(WebSessions.IsCUser); 
    thisView.isUser = (WebSessions.IsCUser);
}

使用它来插入或更新

Activity a = new Activity();
a.ID = cID;
a.ActivityModDate = date;
GetValuesForUserORMember(a) <---function
ctx.AddToActivities(a);
ctx.SaveChanges();

OpenTask o = new OpenTask();
o.ID = cID;
o.TaskCompletedDate = date;
o.TaskAssingedTo = uID;
GetValuesForUserORMember(o) <---function
ctx.AddToActivities(o);
ctx.SaveChanges();

对于每个表/视图模型(Activity和OpenTask),这(4)个字段完全相同。但是,每个表中都有不同的OTHER字段。

将视图模型传递到函数中

假设它们不共享基类或接口,则可以使用dynamic:

GetValuesForUserORMember(dynamic thisView)
{
    thisView.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID;
    thisView.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0;
    thisView.isMember = !(WebSessions.IsCUser); 
    thisView.isUser = (WebSessions.IsCUser);
}

我猜你的问题是因为类型不同?如果是这样,则可以创建两个对象都继承自的接口,也可以创建基类(或两者都创建)。然后,您可以按照描述创建方法,其中预期的参数是接口或基类的参数。然后,您将能够传入从该类型继承的任何对象。

事实上,你可以用这样一种方式创建基类。

或者,您可以使用动态来执行此操作,但是您将失去任何静态类型检查的好处。如果你可以控制你的类,我不建议这样做,因为.NET是一种静态语言。他们添加这种类型只是为了方便边缘情况。但是,再说一遍,这只是我对动态的看法

示例:

//This is the base class option, but you could use an interface
//If you encapsulate the FillProperties method it should be in a base class, though
public class BaseViewModel
{
    int memID {get;set;}
    int caseUserID {get;set;}
    bool isMember {get;set;}
    bool isUser {get;set;}
    public void FillProperties()
    //These actions could also possibly be done on the fly in the properties
    {
        memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID;
        caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0;
        isMember = !(WebSessions.IsCUser); 
        isUser = (WebSessions.IsCUser);
    }
}
public class Activity : BaseViewModel
{
    //additional properties for Activity only
}
public class OpenTask : BaseViewModel
{
    //additional properties for OpenTask only
}

然后你可以这样称呼它

var activity = new Activity();
activity.FillProperties();

或者,您可以将FillProperties删除到另一个类中,如您所描述的,并执行如下操作:

GetValuesForUserORMember(BaseViewModel thisView)
{
    thisView.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID;
    thisView.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0;
    thisView.isMember = !(WebSessions.IsCUser); 
    thisView.isUser = (WebSessions.IsCUser);
}

不确定我是否理解这个问题。但是,如果Activity和OpenTask具有需要在方法中填充的相同属性,则应该创建一个包含这些属性的基类,并从该类继承这两个属性。然后可以在方法中使用BaseClass类型作为参数。

是的,您可以将视图模型作为参数传递到函数中。您应该在每个视图模型中实现相同的函数来支持Update()。正如你所能想象的,你需要为每种视图模型覆盖你的函数,以支持传入的不同类型的视图模型参数

看起来您只需要一个ViewModel类的通用接口,它封装了要在方法中设置的所有字段。

// Define better name yourself
// I believe IViewModel is pretty generic for your case
public interface IViewModel
{
   int memId { get; set; }
   int caseUserID { get; set; }
   bool isMember  { get; set; }
   bool isUser { get; set; }
}
class Activity : IViewModel
{ ... }
class OpenTask : IViewModel
{ ... }

最后是方法:

void SetValuesForUserORMember(IViewModel viewModel)
{
    viewModel.memID = WebSessions.IsCUser ? 0 : WebSessions.MemID;
    viewModel.caseUserID = WebSessions.IsCUser ? WebSessions.CUserID : 0;
    viewModel.isMember = !WebSessions.IsCUser; 
    viewModel.isUser = WebSessions.IsCUser;
}

作为替代解决方案,您可以在公共接口中定义此方法,并传入WebSessions:

interface IViewModelBuilder
{
    void UpdateUserAndMembeDetails(WebSession sessions);
}
void UpdateUserAndMembeDetails(WebSessions ws)
{
    this.memID = ws.IsCUser ? 0 : ws.MemID;
    this.caseUserID = ws.IsCUser ? ws.CUserID : 0;
    this.isMember = !ws.IsCUser; 
    this.isUser = ws.IsCUser;
}