Asp.net mvc 4 将模型传递给BeginForm方法时获得不同的行为

Asp.net mvc 4 将模型传递给BeginForm方法时获得不同的行为,asp.net-mvc-4,model-binding,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

我遇到了一个奇怪的情况。我有以下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)
以下是my
InwardDocument
控制器中的
EditDocument
操作方法:

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">
}
这确实有助于解决问题,但我有两个顾虑:

  • 为什么通过模型起作用?模型是否与从action方法传递的内容相同
  • 传球模式解决了上述问题,但也带来了另一个祸害。如果我这样做,我会得到错误的复选框值,如中所述

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

    @using (Html.BeginForm("SaveDocument","InwardDocument"))
    {
    
    @Html.HiddenFor(x=>x.DocNumber)
    
    <input type="submit" value="Save">
    
    }
    
    @使用(Html.BeginForm(“SaveDocument”、“InwardDocument”))
    {
    @Html.HiddenFor(x=>x.DocNumber)
    }
    
    为什么我必须为此创建一个隐藏字段?我的模型已包含属性?除此之外,为什么传递模型解决了这个问题?因为模型属性是通过表单中的输入控件发布的,所以我们需要为每个项目创建输入控件,我们不希望用户编辑或显示的项目,我们使用隐藏字段,否则这些属性将发布为nullOK,@Ehsan,我明白为什么我需要一个隐藏的字段。基本上是因为没有绑定模型属性的位置。需要有一个html元素来保持模型属性值。但是我很高兴知道为什么将模型传递给BeginForm方法有效?您所说的
    为什么将模型传递给BeginForm方法有效是什么意思?
    ?如果我使用(Html.BeginForm(“SaveDocument”、“InwardDocument”、new RouteValueDictionary(Model)),即使我不为DocNumber添加隐藏值,问题也会消失。为什么?我知道模型是隐式传递的,但这样我就有了我提到的问题,但如果我显式传递模型,问题就会消失。
    @using (Html.BeginForm("SaveDocument","InwardDocument"))
    {
    
    @Html.HiddenFor(x=>x.DocNumber)
    
    <input type="submit" value="Save">
    
    }