遇到一个奇怪的问题,我的模型没有绑定,并在控制器上显示为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(尚未更新,但我会这样做,看看是否有任何事情发生。我不指望它会发生。)
答案 0 :(得分:3)
您的问题是您的模型包含名为Message
的属性,并且您还有一个名为message
的参数DefaultModelBinder
会读取包含message = "someTextValue"
的表单值并进行搜索对于名称为message
的模型属性。它找到你模型中的那个并设置它的值(到目前为止一切正常),然后它找到另一个(你的参数)并尝试设置复杂对象string
值的值(实际上{{1} }}失败,因此模型变为ContactMessage message = "someTextValue";