POST其他ViewModel中包含的ViewModel asp.net mvc

时间:2016-02-26 06:16:25

标签: asp.net-mvc

我有一个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;这样做的方式。

1 个答案:

答案 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)
{
    ....
}