将Model传递给BeginForm方法时获得不同的行为

时间:2014-06-30 07:28:34

标签: asp.net-mvc-4 model-binding

我遇到了一个奇怪的情况。我有以下viewmodel:

public class Document{
   public string DocNumber{get;set;}
   public string LastName {get;set;}
   //omitted for brevity
}

有一个名为EditDocument的视图强烈输入此模型。在另一个视图中,我有以下操作链接:

@Html.ActionLink("Edit", "EditDocument", "InwardDocument", new { docNumber=Model.DocNumber},null)

以下是EditDocument控制器中的InwardDocument操作方法:

public ActionResult EditDocument(string docNumber){
 DocumentRepository repository = new DocumentCitizenRepository();
 Document doc = repository.Documents.SingleOrDefault(x => x.DocNumber == docNumber);
 return View(viewName:"EditDocument",model: doc);
}

最后,这是EditDocument.cshtml:

@using (Html.BeginForm("SaveDocument","InwardDocument")){
   //omitted for brevity
   <input type="submit" value="Save">
}

SaveDocument操作方法接收Document对象作为模型。当我调试此方法时,我发现该模型的DocNumber属性为null。但是在调试EditDocument方法时,从存储库检索的Document的DocNumber属性值不为null(以下为“1”)。  作为一种解决方法,我试图将Model传递给BeginForm方法,如下所示:

@using (Html.BeginForm("SaveDocument","InwardDocument",new RouteValueDictionary(Model)))

确实有助于解决问题,但我有两个问题:

  1. 为什么传递模型有效?模型与动作方法传递的内容不一样吗?
  2. 传递模型解决了上述问题,但它带来了另一个祸害。如果我这样走,我会得到this SO question
  3. 中描述的假复选框值

1 个答案:

答案 0 :(得分:1)

你必须在表单的隐藏字段中传递DocNumber,否则它将被发布为null:

@using (Html.BeginForm("SaveDocument","InwardDocument"))
{

@Html.HiddenFor(x=>x.DocNumber)

<input type="submit" value="Save">

}