我有一个ViewModel,它包含另外两个ViewModel(为简洁起见而剥离):
class SmallViewModel1
{
public string Item { get; set; }
}
class SmallViewModel2
{
public string Item { get; set;}
}
class BigViewModel {
public SmallViewModel1 Model1 { get; set; }
public SmallViewModel2 Model2 { get; set; }
}
然后我有一个接受BigViewModel
作为其模型的视图。该视图有两种形式,它们对两个不同的动作进行POST。
@model BigViewModel
@using (Html.BeginForm("Action1","Controller",FormMethod.Post))
{
@Html.TextBoxFor(t=>t.Model1.Item)
}
@using (Html.BeginForm("Action2","Controller",FormMethod.Post))
{
@Html.TextBoxFor(t=>t.Model2.Item)
}
然后在控制器中我试图做这样的事情:
public ActionResult Action1(SmallViewModel1 model)
{
....
}
public ActionResult Action2(SmallViewModel2 model)
{
....
}
我遇到的问题是,如果我使用&#39; For&#39;控件(EditorFor,TextBoxFor等)我的POSTed模型为null。我想这是因为它希望我发布完整的ViewModel(BigViewModel)并命名输入所需的输入:<input name="Model1.Item"
。为了解决这个问题,我一直在使用非&#39; For&#39;控制并只是将名称设置为SmallViewModel的属性,例如:@Html.TextBox("Item")
。这正确地映射到控制器,一切都结束了。
我的问题是我正确地这样做了吗?我一直在谷歌上搜索一下,没有找到任何东西,但我觉得有一个更好的,或更多的最佳实践&#39;这样做的方式。
答案 0 :(得分:2)
你的控制器应该是这样的
public ActionResult Action1(BigViewModel model)
{
....
}
public ActionResult Action2(BigViewModel model)
{
....
}
当您使用BigViewModel时,提交时它应该在参数
中具有相同的模型或者,您可以使用Prefix
BindAttribute
属性
public ActionResult Action1([Bind(Prefix="Model1")]SmallViewModel1 model)
{
....
}
public ActionResult Action2([Bind(Prefix="Model2")]SmallViewModel2 model)
{
....
}