ASP.NET MVC控制器接收FilmVM ViewModel参数返回null的问题及解决
问题根因
ASP.NET MVC的模型绑定是基于表单提交的name属性与后台参数的属性路径做匹配映射的,你的问题是表单字段名和ViewModel的属性路径不匹配:
- 主视图调用局部视图时直接传入
Model.Film作为模型,局部视图生成的表单控件name属性均为FilmId、Name、Year这类无前缀的格式 - 控制器接收的
FilmVM为嵌套结构,模型绑定期望接收的对应字段名是Film.FilmId、Film.Name、Film.Year,两边无法匹配,导致最终FilmVM参数绑定失败为null
可选解决方案
方案1:调用局部视图时手动指定绑定前缀
修改主视图中调用局部视图的代码,显式指定HtmlFieldPrefix为Film,让局部视图生成的表单控件自动带上匹配的前缀:
@Html.Partial("EditFilm", Model.Film, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Film" } })
修改后原有接收FilmVM参数的控制器动作无需调整,即可正常完成模型绑定。
方案2:使用EditorTemplate替代普通局部视图
将你的EditFilm局部视图移动到项目~/Views/Shared/EditorTemplates/目录下,重命名为Film.cshtml,之后主视图中直接调用EditorFor方法即可:
@Html.EditorFor(model => model.Film)
框架会自动识别类型生成带正确前缀的表单控件,无需手动配置前缀,代码更简洁易维护。
你自行调整的拆分参数方案也是可行的,模型绑定可以直接匹配无前缀的表单字段,只是当ViewModel属性较多时,控制器参数的写法会比较冗余,上述两个方案更贴合ViewModel的设计使用规范。
内容的提问来源于stack exchange,提问作者Yehor Karachetsev
相关产品推荐
相关产品推荐

