【问题标题】:Pass View Model into a Function将视图模型传递给函数
【发布时间】:2012-03-02 18:47:42
【问题描述】:

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

我们有以下代码

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) 个字段完全相同。但是,每个表中都有其他字段不相同。

【问题讨论】:

    标签: c# asp.net viewmodel


    【解决方案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);
    }
    

    【讨论】:

    • 假设他在 .NET 4 中工作。但使用动态效果很好。
    • 嗯,是的 - 您必须使用支持此解决方案(或任何其他)的版本才能使其工作。但是,鉴于 C# 4 现在已有 1.5 年的历史,并且没有提及特定版本 - 我将假设“当前”。也就是说,如果有人不清楚,动态是在 C# 4 中引入的——所以如果你的编译器告诉你它不知道动态是什么,你就不能使用这个解决方案。
    【解决方案2】:

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

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

    或者,您可以使用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);
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          看起来你只需要一个 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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-01
            • 2011-02-20
            • 2014-09-14
            • 1970-01-01
            • 2011-12-21
            • 2011-08-10
            相关资源
            最近更新 更多