Mvc 3型号自动装订

时间:2012-04-27 17:15:24

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

我有一个ViewModel,我想在帖子上自动绑定到另一个ViewModel。

EG。如果我有

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。

3 个答案:

答案 0 :(得分:0)

你不能继承ViewModelB中的ViewModelA吗?

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.
}

答案 1 :(得分:0)

如果你的模型具有相同的属性名称以进行绑定,无论是通过继承实现这一点,还是通过拥有其业务是设置实际属性名称的辅助属性,它会更直接。

这样可以更清楚地表明ViewModelB希望能够以不同方式处理某些属性名称,并使视图模板不那么混乱。

答案 2 :(得分:0)

只需指定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就会为您处理。