我有一个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。
答案 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就会为您处理。