ASP.NET MVC回发后model.Code为空的问题根因与解决咨询
根因分析
这个问题是ASP.NET MVC默认模型绑定的前缀匹配规则导致的:
- 你POST接口的Action参数命名为
model,MVC的模型绑定器在匹配表单字段时,会优先查找name属性带model.前缀的字段来填充这个参数 - 用
@Html.TextBoxFor(m => m.Code)生成的字段默认name是Code,不带前缀,自然匹配失败,所以取值为null - 你手动写的其他控件加了
Model.前缀,刚好匹配了参数名前缀,所以能正常取值
标准解决方案
方案1:修改Action参数名(最简便)
把Action的参数名改成非model的任意名称即可,不需要修改任何视图代码,Razor默认生成的name="Code"的输入框就能正常绑定:
[HttpPost] public ActionResult UpdateUserPermissions(UserManagementViewModel userModel) { // userModel.Code可正常获取输入值 return RedirectToAction("UserManagement"); }
方案2:显式指定绑定前缀
如果不想修改参数名,可以给参数加[Bind]特性强制忽略前缀:
[HttpPost] public ActionResult UpdateUserPermissions([Bind(Prefix = "")] UserManagementViewModel model) { // 绑定器会忽略参数名前缀规则,直接匹配不带前缀的表单字段 return RedirectToAction("UserManagement"); }
方案3:视图层统一指定前缀(适用于复杂场景)
如果页面存在多个模型绑定、或者大量手动写的控件已经带Model.前缀,可以在视图顶部统一设置前缀,后续所有Html.XXXFor辅助方法生成的控件都会自动带上指定前缀,不需要每个控件单独修改Name:
@{ Html.ViewData.TemplateInfo.HtmlFieldPrefix = "Model"; }
内容的提问来源于stack exchange,提问作者FLICKER
相关产品推荐
相关产品推荐

