Asp.net mvc 4 将模型传递给BeginForm方法时获得不同的行为
我遇到了一个奇怪的情况。我有以下viewmodel: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
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)
以下是myInwardDocument
控制器中的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">
}
这确实有助于解决问题,但我有两个顾虑:
您必须在表单中的隐藏字段中传递
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">
}