0

我在我的控制器上有一个操作,它采用两个参数,当发布表单时应该捕获这些参数:

[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>

如果我向名为“command”的操作添加另一个字符串参数,则按钮的值会通过,但它不会绑定到参数Command上的属性FormAction- 参数始终为空。

如果我添加一个Command属性,MyModel那么按钮值确实会通过。

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

4

2 回答 2

0

仪表是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)
于 2013-08-13T16:30:13.973 回答
0

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

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

于 2013-08-15T10:01:09.617 回答