起因

这个是网友在官网论坛的提问: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表单提交后台模型二级属性验证问题的更多相关文章

  1. Asp.net Mvc post表单提交多个实体模型

    上一遍说道用Tuple实现Asp.net Mvc action返回多个模型实体给view,此篇发过来,实现view表单提交多个实体模型到action. 1.view代码: @{ Layout = nu ...

  2. ASP.NET MVC多表单提交

    多表单提交需要写清路径,以便主程序可以找到 方法一:直接写路径, action="~/Home/other1"   "~"表示从根目录开始 方法2:@using ...

  3. spring mvc form表单提交乱码

    spring mvc form表单submit直接提交出现乱码.导致乱码一般是服务器端和页面之间编码不一致造成的.根据这一思路可以依次可以有以下方案. 1.jsp页面设置编码 <%@ page ...

  4. php 处理 form 表单提交多个 name 属性值相同的 input 标签

    一 问题 在公司的开发过程中,遇到了一个问题:如何处理 form 表单提交了多个 name 属性值相同的 input 标签?源码如下(源码是在 form 表单之中的): <!--{loop $a ...

  5. ASP.NET MVC Form表单验证与Authorize特性

    一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...

  6. Asp 循环输出 form 表单提交的数据

    亲测asp提交form表单数据,在接收页面循环输出数据 dim var for each var in request.form response.write var&"=" ...

  7. 转: ASP.NET+ExtJs4.0+表单提交submit,上传图片到服务器

    http://blog.csdn.net/lmaohuanl/article/details/6792057 <!DOCTYPE html PUBLIC "-//W3C//DTD XH ...

  8. ASP.NET MVC 获取表单数据

    public class Person { public string Name{get;set;} public string Phone{get;set;} } view层 @model Mode ...

  9. layui弹出表单提交后,界面model验证部分起作用

    情况1----input属性中type=submit时验证都可以起作用,但是弹出层表单的返回值不能获取,所以用ajax二次提交后会出现重复添加数据的问题 情况2----input属性中type=but ...

随机推荐

  1. WPF 3D model - Sphere, Cone, and Cylinder

    原文:WPF 3D model - Sphere, Cone, and Cylinder   Extending Visual3D - Sphere, Cone, and Cylinder http: ...

  2. CMMI 能力成熟度模型集成

    关于CMMI的过程域,请参考 CMMI能力成熟度模型集成的过程区域 1.CMMI/SPCA概述 CMM是“能力成熟度模型(Capability Maturity Model)”的英文简写,该模型由美国 ...

  3. OpenGL(七) 光照模型及设置

    OpenGL把现实世界中的光照系统近似归为三部分,分别是光源.材质和光照环境. 光源就是光的来源,是"光"这种物质的提供者: 材质是指被光源照射的物体的表面的反射.漫反射(Open ...

  4. 存储过程和输出分辨率表菜单JSON格式字符串

    表的结构,如以下: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo] ...

  5. OpenWrt 主的发展版本号trunk MT7620N 无线驱动程序bug

    周边环境: OpenWrt Development Trunk: svn co svn://svn.openwrt.org/openwrt/trunk/ BUG: 1. 无线无法建立连接. 2. 无线 ...

  6. hibernate关于多对多注解配置

    Game实体类配置关系 @Entity @Table(name = "game") public class Game { @Id @GeneratedValue private ...

  7. Fidder模拟发送请求

    在Fiddler的Composer一栏,可以模拟请求 举例 首先通过浏览器访问页面http://baidu.com/ ,在右侧可以拿到请求情况 在Inspectors一栏可以看到请求和响应结果,复制请 ...

  8. delphi中WebBrowser的parent改变时变成空白问题的解决(覆盖CreateWnd和DestroyWnd)

    这段时间在做一个delphi界面打开网页的功能,且此网页所在窗口可完整显示,可缩小到另一个窗口的panel上显示 可是在改变网页所在窗口时,WebBrowser控件变成了空白 上网google了半天, ...

  9. thinkphp5 的一些笔记

    Model里面的一些属性添加 protected $resultSetType = 'collection'; protected $autoWriteTimestamp = 'timestamp'; ...

  10. 关于WPF后台触发键盘按键

    1.变向响应Tab按键 private void Grid_KeyUp(object sender, KeyEventArgs e)         {             UIElement e ...