参数名称必须是模型吗?

时间:2014-06-09 05:13:25

标签: asp.net-mvc binding model

遇到一个奇怪的问题,我的模型没有绑定,并在控制器上显示为null。

我有一个表格做一个httppost。我在控制器中的断点被击中,我期望成为我模型的参数为空。

查看另一个有效的页面上的示例代码,我复制并粘贴它,唯一的区别是参数的名称是'model'而不是message。

查看

@model Site.Models.ContactMessage

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>ContactMessage</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Message, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Message, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Message, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.To, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.To, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.To, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

控制器

    public ActionResult Contact()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Contact(ContactMessage message)
    {
        var m = message;
        return View();
    }

它有效。我以为我一定完全错过了一些关于命名约定的东西。发现你可以使用Bind,从阅读一堆其他帖子,改变前缀,如;

    public ActionResult Contact([Bind(Prefix = "model")] ContactMessage message)

但这不起作用,仍为空。要将它重命名为模型,以便它可以工作,我可以继续前进,但想知道为什么它不绑定,如果不是模型。

    public ActionResult Contact(ContactMessage message)

如上所述更改回此值但仍返回null。 有趣的是,如果我打开另一个MVC应用程序,那个具有我想要的任何参数名称并且工作正常。它使用的是旧版本的MVC 5(尚未更新,但我会这样做,看看是否有任何事情发生。我不指望它会发生。)

1 个答案:

答案 0 :(得分:3)

您的问题是您的模型包含名为Message的属性,并且您还有一个名为message的参数DefaultModelBinder会读取包含message = "someTextValue"的表单值并进行搜索对于名称为message的模型属性。它找到你模型中的那个并设置它的值(到目前为止一切正常),然后它找到另一个(你的参数)并尝试设置复杂对象string值的值(实际上{{1} }}失败,因此模型变为ContactMessage message = "someTextValue";