ASP.NET MVC/Core表单提交后台模型二级属性验证问题
起因
这个是网友在官网论坛的提问:https://fineui.com/bbs/forum.php?mod=viewthread&tid=22237
重新问题
本着务实求真的态度,我们先来复现这个问题。首先页面截图是这样的:
类 MsStudentMajor 有两个非空属性 Major2 和 Desc2,如下所示:
public class MsStudentMajor { /// <summary> /// 标识 /// </summary> public int Id { get; set; } /// <summary> /// Name /// </summary> public string Name { get; set; } /// <summary> /// 所学专业 /// </summary> [Required] public string Major2 { get; set; } [Required] public string Desc2 { get; set; } }
但是页面上只用到了 Major2,而没有用到 Desc2:
F.SimpleForm() .ID("SimpleForm1") .ShowBorder(false) .ShowHeader(false) .BodyPadding(10) .LabelWidth(180) .Items( F.TextBoxFor(m => m.Name) .Label("姓名"), F.HiddenFieldFor(m => m.Major) .Label("所学专业1"), F.DropDownListFor(m => m.StudentMajor.Major2) .ID("StudentMajor_Major2") //.Name("StudentMajor.Major2") .Label("所学专业2") .Items( F.ListItem() .Text("请选择") .Value(""), F.ListItem() .Text("计算机") .Value("计算机"), F.ListItem() .Text("物理") .Value("物理") ) .SelectedValue(Model.StudentMajor.Major2) //F.TextBoxFor(m => m.StudentMajor.Desc2) // .Label("描述") )
所以在后台的模型绑定验证时出错:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult FormSubmit_btnSave_Click(MsStudent model) { if (ModelState.IsValid) { } return UIHelper.Result(); }
调试分析
遇到问题首先要调试,看下内部变量是否和预想的有出入。首先看下点击保存按钮时客户端提交的数据:
二级属性是以 StudentMajor.Major2 的形式提交的,后台接受到的数据:
一切都合情合理,二级属性也能正确绑定,只不过由于前台并未告知 StudentMajor.Desc2 的值,所以未能绑定,这也在情理之中。
对比测试老版本 FineUIMvc v5.3.0
由于网友在帖子里提到了老版本 FineUIMvc v5.3.0 是可以正常运行的,所以我们找来了老版本,同样测试如下:
和最新版不同的是,这里提交的二级属性名为 StudentMajor_Major2 ,很明显,后台模型绑定时不会自动识别这个字符串:
所以这里,模型绑定出来的 StudentMajor == null。自然而然,就不会提示模型绑定失败,因为未对二级属性进行有效的绑定处理!
很明显,这个应该是老版本的BUG。如果我们仔细看更新记录的话,可能看到相关的改进:https://fineui.com/mvc/version/
解决问题
既然这是老版本的BUG,而新版本没有问题。那该如何满足用户的这个需求呢?
其实很简单,ASP.NET MVC/Core提供了一种机制,可以在模型绑定时排除对某些属性的绑定,如下所示:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult FormSubmit_btnSave_Click([Bind(Exclude = "StudentMajor")]MsStudent model) { if (ModelState.IsValid) { } return UIHelper.Result(); }
注意,这里的 [Bind(Exclude = "StudentMajor")] 就是告诉ASP.NET MVC/Core 框架在模型绑定时忽略 StudentMajor 属性。
万事皆有因,万般皆有果。
- ASP.NET MVC 客户端验证失败后表单仍然提交问题
- asp.net mvc 模型验证注解,表单提交
- ASP.NET MVC 客户端验证失败后表单仍然提交问题
- Asp.net Mvc post表单提交多个实体模型
- asp.net mvc利用Json验证数据和导向页面,解决重复提交问题
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证
- ASP.NET MVC 3.0 知识记要(3)【主从属性共同编辑后的表单提交】
- ASP.NET MVC post提交表单 后台值为空
- ASP.NET MVC 基于强类型视图下 对模型以及模型中List 字段的同时编辑 表单提交
- asp.net mvc 表单重复提交问题。如何解决呀?
- Asp.net MVC中表单验证属性的使用
- ASP.NET\ASP.NET MVC表单提交遇到的问题结论
- 解决asp.net表单提交按钮当设定OnClientClick事件后不再进行表单验证的问题
- (转)ASP.NET MVC 第五个预览版和表单提交场景
- Asp.Net MVC杂谈之:—步步打造表单验证框架(2)
- DataProtection设置问题引起不同ASP.NET Core站点无法共享用户验证Cookie
- ASP.NET MVC:定制Numeric属性验证消息
- 一起谈.NET技术,ASP.NET MVC验证框架中关于属性标记的通用扩展方法
- asp.net mvc使用validate.js验证 若name属性包含特殊字符则加上双引号即可