组合模型提交至Controller时始终为空的问题求助
解决ASP.NET MVC复合模型提交为空的问题
嘿,这个问题我之前也踩过坑,本质就是模型绑定的属性名称不匹配,咱们来快速搞定它:
先看你的模型代码,你定义的复合模型里两个子模型属性是fmodel和smodel:
namespace Test.Models { public class Compination { public firstmodel fmodel{ get; set; } public secondmodel smodel{ get; set; } } }
但在视图里,你却写了model.firstmodel.Name——这里的firstmodel和模型里的fmodel对不上!MVC的模型绑定器根本找不到对应的属性,自然就给你返回空模型了。
直接修改视图即可解决
把视图里的属性引用改成和模型一致的名称就行:
@model Test.Models.Compination @using (Html.BeginForm("Edit", "Home", FormMethod.Post)){ <div> @Html.LabelFor(model => model.fmodel.Name, "Name") @Html.EditorFor(model => model.fmodel.Name) </div> <!-- 其他子模型字段同理,把secondmodel换成smodel --> }
为啥会这样?(简单说下原理)
ASP.NET MVC的模型绑定是靠表单输入框的name属性来匹配模型属性的。当你用EditorFor(model => model.fmodel.Name)时,生成的HTML输入框name会是fmodel.Name,绑定器就能顺着这个路径找到Compination里的fmodel,再把值赋给它的Name属性。要是名称错了,绑定器找不到对应属性,就只能初始化一个空的复合模型给你。
最后给你两个小建议:
- 尽量遵循C#命名规范,类名用帕斯卡命名(比如
FirstModel代替firstmodel),属性名也尽量清晰,比如用FirstModel代替fmodel,能大幅减少这类拼写错误。 - 提交前可以打开浏览器开发者工具,检查生成的输入框name属性是不是和模型的属性路径一致,这样能快速排查绑定问题。
内容的提问来源于stack exchange,提问作者programmer
相关产品推荐
相关产品推荐

