MVC4模型与两个复杂模型绑定

时间:2013-08-13 11:28:01

标签: asp.net-mvc model-binding

我的控制器上有一个操作,它会在发布表单时捕获两个参数:

[HttpPost]
public ActionResult Index(MyModel model, FormAction action)

我们的想法是应该在MyModel中捕获模型数据,并且应该在FormAction中捕获用户按下的按钮:

public class MyModel
{
    public string MyValue { get; set; }
}

public class FormAction
{
    public string Command { get; set; }
}

以下是我的观点:

@model TestApp.Models.MyModel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>

        @using (Html.BeginForm("Index", "Home"))
        {
            @Html.TextBoxFor(x => x.MyValue)

             <input type="submit" value="OK" name="command" />
             <input type="submit" value="Cancel" name="command" />
        }

    </div>
</body>
</html>

如果我在名为&#39;命令&#39;的操作中添加另一个字符串参数。然后按钮的值通过,但它不会绑定到Command参数上的FormAction属性 - 参数始终为null。

如果我向Command添加MyModel属性,那么按钮值就会通过。

MVC模型绑定中是否存在阻止在一个操作方法中绑定多个复杂模型的内容?

2 个答案:

答案 0 :(得分:0)

metter是Html.BeginForm仅从顶级状态发送模型:@model TestApp.Models.MyModel。如果我清楚地了解您要做什么,更好的解决方案是创建ViewModel:

public class ViewModel
{
 public MyModel myModel {get; set;}
public FormAction formAction {get; set;}
}

更改视图如下:

@model TestApp.Models.ViewModel

@{
    Layout = null;
}


<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>

        @using (Html.BeginForm("Index", "Home"))
        {
            @Html.TextBoxFor(model=> model.myModel.MyValue)
            @Html.TextBoxFor(model=> model.formAction.Command)

             <input type="submit" value="OK" name="command" />
             <input type="submit" value="Cancel" name="command" />
        }

    </div>
</body>
</html>

将您的行动更改为:

[HttpPost]
public ActionResult Index(ViewModel model)

答案 1 :(得分:0)

我已经到了底层并且它不起作用的原因仅仅是因为参数被命名为 action 。这几乎相当于MVC中的关键字,MVC框架使用它来标识要执行的操作。

将参数名称更改为其他名称意味着Command属性按预期进行!