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()
.LabelWidth()
.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/Core表单提交后台模型二级属性验证问题的更多相关文章
- Asp.net Mvc post表单提交多个实体模型
上一遍说道用Tuple实现Asp.net Mvc action返回多个模型实体给view,此篇发过来,实现view表单提交多个实体模型到action. 1.view代码: @{ Layout = nu ...
- ASP.NET MVC多表单提交
多表单提交需要写清路径,以便主程序可以找到 方法一:直接写路径, action="~/Home/other1" "~"表示从根目录开始 方法2:@using ...
- spring mvc form表单提交乱码
spring mvc form表单submit直接提交出现乱码.导致乱码一般是服务器端和页面之间编码不一致造成的.根据这一思路可以依次可以有以下方案. 1.jsp页面设置编码 <%@ page ...
- php 处理 form 表单提交多个 name 属性值相同的 input 标签
一 问题 在公司的开发过程中,遇到了一个问题:如何处理 form 表单提交了多个 name 属性值相同的 input 标签?源码如下(源码是在 form 表单之中的): <!--{loop $a ...
- ASP.NET MVC Form表单验证与Authorize特性
一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...
- Asp 循环输出 form 表单提交的数据
亲测asp提交form表单数据,在接收页面循环输出数据 dim var for each var in request.form response.write var&"=" ...
- 转: ASP.NET+ExtJs4.0+表单提交submit,上传图片到服务器
http://blog.csdn.net/lmaohuanl/article/details/6792057 <!DOCTYPE html PUBLIC "-//W3C//DTD XH ...
- ASP.NET MVC 获取表单数据
public class Person { public string Name{get;set;} public string Phone{get;set;} } view层 @model Mode ...
- layui弹出表单提交后,界面model验证部分起作用
情况1----input属性中type=submit时验证都可以起作用,但是弹出层表单的返回值不能获取,所以用ajax二次提交后会出现重复添加数据的问题 情况2----input属性中type=but ...
随机推荐
- DDD实战6 WebAPI
1.在Products解决方案文件夹下面新建一个项目 .net Core/Asp.net Core Web应用程序 取名Product.WebApi/选择Web Api core2.0版本 不进行身 ...
- 简明Python3教程 13.面向对象编程
简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的 ...
- 编程算法 - 旋转矩阵 代码(C)
旋转矩阵 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 输出旋转矩阵, 使矩阵是按对角线螺旋上升, 在输出规则确定以后, 就能够推断, 上升规律是, ...
- Expression.Blend.4 Chapter 图片和视频的使用
原文:Expression.Blend.4 Chapter 图片和视频的使用 翻译的地方可能有错误,欢迎大家指正.但是里面每一个程序都是亲自测试过,并加了点自己的看法. 我翻译的是Expression ...
- [Songqw.Net 基础]WPF实现简单的插件化开发
原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/ar ...
- 统计web訪问前10的ip
cat access.log|awk '{print $0}'|sort|uniq -c|sort -nr|head -n 10
- ubuntu12.04单卡server(mentohust认证)再加上交换机做路由软件共享上网
最近成立了实验室的网络环境中,通过交换机连接的所有主机实验室.想要一个通过该server(单卡)做网关,使用mentohust认证外网,然后内网中的其它主机通过此网关来连接外网. 1.首先在serve ...
- WPF中StringFormat的用法
原文:WPF中StringFormat的用法 WPF中StringFormat的用法可以参照C#中string.Format的用法 1. C#中用法: 格式化货币(跟系统的环境有关,中文系统默认格式化 ...
- 就服务器项目部署debug谈谈自己的感受
前言 学校小组Project那些外国人啥也不会, 基本上我一个人全包了前端和后端, 说实话这些天来也感受到了写一个比较拿得出手的web确实也不是这么容易的, 特别是我没什么项目经验, 很多时候碰到问题 ...
- jquery 选择标题标签
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...