【问题标题】:Mvc 3 model auto bindingMvc 3 模型自动绑定
【发布时间】:2012-04-27 17:15:23
【问题描述】:

我有一个 ViewModel,我想在发布时自动绑定到另一个 ViewModel。

例如。如果我有

public class ViewModelA{
    public string Stuff {get;set;}
}

public class ViewModelB{
    public string MyStuff {get;set;}
    .
    .
    .
}

出于显示/渲染的目的,我希望将部分绑定到 ViewModelA,因为它是一个更简单的对象,因此它有望更加可重用,因为创建交互式视图是一个代价高昂的提议。

但是,我需要在帖子页面上的所有表单信息。我想我可以扩大控制器操作以同时采用 ViewModelA 和 ViewModelB,然后执行额外的逻辑将 ViewModelA 属性分配给 ViewModelB,但是有没有更简洁、更具声明性的方式来做到这一点?

我想我想知道我是否可以标记 ViewModelA,具有如下属性:

 [Bind(Prefix = "ViewModelB", Include = "MyStuff")]

我知道我可以在操作级别执行此操作,但我可以在 ViewModel 级别注入此逻辑吗?

如果 Razor 遵循更多的 CQRS 方法,那也很好。例如。

Html.TextBoxFor(target => target.Property, model => model.Property2)

因此,在渲染时,文本框使用 Property2 值初始化,但在发布时,它被发布到 target.Property。

【问题讨论】:

    标签: c# .net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    你不能在ViewModelA中继承ViewModelB吗?

    public class ViewModelA : ViewModelB
    {
         public string Stuff {get;set;}
         // etc.
    }  
    
    public class ViewModelB
    {     
        public string MyStuff {get;set;}
        // etc.
    } 
    

    然后在您的 Controller 方法中,只需指定更宽的 ViewModelB,模型绑定仍应映射所有内容。

    [HttpPost]
    public ActionResult(ViewModelB model)
    {
        // etc.
    }
    

    【讨论】:

    • 我认为这是解决问题的一种方法,但我一般讨厌类继承和 IsA 关系。还有当有 3 个或更多 ViewModel 并且我希望其中 2 个转到 ViewModelB 时会发生什么?或者,如果 ViewModelA 有一些不相关的“显示”属性怎么办?继承比他们的价值更令人头疼。我喜欢尽可能保持 ViewModel POCO 和松散耦合。
    • 讨厌类继承?你为什么还要使用 .NET?
    • @cadrell0 如何处理需要通过类继承映射到一个 ViewModel 的 2 个不同的视图模型?以及如何保持目标 ViewModel 没有不需要的属性?提示:你不能。
    • @Alwyn:您不能将评论标记为离题。和“赞成组合胜过继承”!=“继承是邪恶的”。请尽量保持你的 cmets 礼貌。
    • @Will WTF 的目的是:“你为什么还要使用 .NET”
    【解决方案2】:

    如果您的两个模型出于绑定目的而具有相同的属性名称,那么无论您是通过继承还是通过具有其业务是设置真实属性名称的辅助属性来实现这一点,都会更直接。

    这将使 ViewModelB 期望能够以不同的方式处理某些属性名称并使视图模板不那么混乱更加清楚。

    【讨论】:

      【解决方案3】:

      只需将ViewModelB 指定为处理表单帖子的操作的参数。

      例如:

      [HttpPost]
      public ActionResult Create(ViewModelB newWidget) {
          // handle creation of widget... all information on the form pertaining to viewmodelB will be
          // available in newWidget
      }
      

      使用什么模型来生成视图并不重要;只要有与 ViewModelB 中的属性名称匹配的表单字段名称,Model Binder 就会为您处理。

      【讨论】:

        猜你喜欢
        • 2012-07-27
        • 2011-10-19
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多