将视图模型传递给函数

时间:2012-03-02 18:47:42

标签: c# asp.net viewmodel

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

我们有以下代码

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();

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

5 个答案:

答案 0 :(得分:1)

假设他们不共享基类或接口,您可以使用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);
}

答案 1 :(得分:1)

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

实际上,您可以以这样的方式创建基类。

或者,您可以使用dynamic来执行此操作,但是您将失去任何静态类型检查权益。如果您可以控制您的类,我不建议这样做,因为.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);
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

看起来您只需要一件事就是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;
}

答案 4 :(得分:0)

是的,您可以将视图模型作为参数传递给函数。您应该在每个视图模型中实现相同的功能以支持Update()。另外,您可以想象,您需要覆盖每种视图模型的函数,以支持传递的不同类型的视图模型参数。我建议考虑采用不同的方式