2014-06-09 40 views
2

遇到一个奇怪的问题,其中我的模型没有绑定并显示在控制器上为空。参数的名称是否必须是模型?

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

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

查看

@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(); 
    } 

和它的工作。我以为我一定完全错过了命名约定。发现你可以使用绑定,从阅读一堆其他职位,改变像前缀;

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

但是没有工作,仍然是空的。要将其重命名为模型,以便它可以工作,我可以继续前进,但想知道为什么它不具有约束力(如果不叫做模型)。

public ActionResult Contact(ContactMessage message) 

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

+0

我试着创建一个ContactMessage的实例,设置字段并将其传递给视图。它按照我的预期填充了该领域。除非变量的名称是model,否则更改值并提交仍然返回null。 –

回答

3

您的问题是,您的模型包含一个名为Message的属性,还有一个名为message的参数DefaultModelBinder将读取将包括message = "someTextValue"的表格值并搜索名称为message的模型属性。它会找到你模型中的值并设置它的值(到目前为止都是OK),但是它会找到另一个值(你的参数)并尝试设置一个复杂对象值(实际上是ContactMessage message = "someTextValue";),该值会失败,因此模型变为null

+0

听起来似乎合理。谢谢! –

相关问题