Asp.net MVC模型未更新
模型:Asp.net MVC模型未更新,asp.net,asp.net-mvc,asp.net-mvc-3,model-binding,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Model Binding,模型: 类地址 { 公共字符串City{get;set;} 公共字符串Zip{get;set;} } 控制器: [HttpPost] 公共操作结果GetAddress(地址模型) { 如果(!String.IsNullOrEmpty(model.Zip)) { model.City=GetCityByZip(model.Zip); } 返回视图(模型); } 视图: @LabelFor(model=>model.City) @Html.TextBoxFor(model=>model.Cit
类地址
{
公共字符串City{get;set;}
公共字符串Zip{get;set;}
}
控制器:
[HttpPost]
公共操作结果GetAddress(地址模型)
{
如果(!String.IsNullOrEmpty(model.Zip))
{
model.City=GetCityByZip(model.Zip);
}
返回视图(模型);
}
视图:
@LabelFor(model=>model.City)
@Html.TextBoxFor(model=>model.City)
@Html.ValidationMessageFor(model=>model.City)
@LabelFor(model=>model.Zip)
@Html.TextBoxFor(model=>model.Zip)
@Html.ValidationMessageFor(model=>model.Zip)
问题是,无论何时城市被修改,它都不会反映在视图上。在调试过程中,
model.City
包含正确的值,但未显示在视图中。即使像@Html.TextBoxFor(model=>model.City)
这样简单的东西也不会显示正确的model.City
值。HtmlHelpers在更新和返回模型时从模型状态而不是模型中获取模型值。为了更新和返回模型,请在post方法中添加以下代码行:
ModelState.Clear();
或者您可以在ModelState本身中设置city的值:
ModelState["City"].Value = GetCityByZip(model.Zip);
正如Tommy所指出的,这是一种有点违反直觉的正确行为,因为在post上提交的表单数据在将数据绑定到返回的视图时具有第一优先级。这是有意义的,因为用户在重新返回同一视图时可能会出现验证错误,恢复表单条目时不会出现在恢复页面时丢失表单输入的问题 另一个选项是手动插入输入值 因此,与此相反:
@Html.TextBoxFor(model=>model.City)
改为这样做:
*这将直接从模型中获取值
甚至更好:
*注意:这不会引入数据val
属性。如果要在此属性上使用它们进行客户端验证,则需要
额外资源