起因

这个是网友在官网论坛的提问: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. Gram 矩阵性质及应用

    v1,v2,-,vn 是内积空间的一组向量,Gram 矩阵定义为: Gij=⟨vi,vj⟩,显然其是对称矩阵. 其实对于一个XN⋅d(N 个样本,d 个属性)的样本矩阵而言,X⋅X′ 即为 Gram ...

  2. Unity3d报告奇怪的错误CompareBaseObjectsInternal can only be called from the main thread.

    其中使用了该项目.NET的Async Socket代码.后来不知道什么时候这个奇怪的错误的出现: CompareBaseObjectsInternal can only be called from ...

  3. 电讯“情趣me”为什么命途多舛?

        古人有句话叫做战争"鼓作气,再而衰,三而竭",意思是打仗必须"一气呵成".才干发挥最大实力,取得最好的战绩.所谓商场如战场,经商也是如此,近期,中国电信 ...

  4. WPF制作的党旗

    原文:WPF制作的党旗 --------------------------------------------------------------------------------引用或转载时请保 ...

  5. 【剑指offer】直扑克

    个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想測測自己的手气,看看能不能抽到顺子,假设抽到的话,他决定去买体育彩票,嘿嘿! ! "红心A,黑桃3,小王,大王,方 ...

  6. ANDROID-BOOTSTRAP开源项目使用方法

    1.将程序导入到工作空间,修改target=android-XX为本地android SDK版本. 2.在项目中点击右键选择Properties->Android Library,添加ANDRO ...

  7. Plugin execution not covered by lifecycle configuration

    Eclipse 环境 在工作空间 \.metadata\.plugins\org.eclipse.m2e.core\ 目录下 增加 lifecycle-mapping-metadata.xml 文件 ...

  8. eclise配置tomcat出现服务Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4 and Java EE 5 Web modules

    当部署项目Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, 1.5 and Java EE 5 Web modules错;解决方案,如下面: 空 ...

  9. Angular基本概念理解

    一些符号的概念 #nzTable 模块变量 [] 输入(绑定值) () 输出(绑定事件) 补充说明: []是控件监控外部变化 ()是监听事件,交给外部变化内部值的权利 二者都是"监听&quo ...

  10. WPF实现弹幕

    实现效果 运用WPF的DoubleAnimation实现桌面端的弹幕效果 示例代码 https://github.com/zLulus/BarrageDemo