默认情况下,asp.net mvc 3中的隐藏,无线电,下拉元素的客户端验证属性

Mar*_*rko 1 asp.net-mvc client-side-validation fluentvalidation-2.0

我正在使用ASP.NET MVC 3 + FLUENT VALIDATION + NINJECT

我有模型X,该模型的规则是这样的:

RuleFor(c => c.FirstName).NotEmpty();
RuleFor(c => c.LastName).NotEmpty();
Run Code Online (Sandbox Code Playgroud)

我发现了一个奇怪的东西,引擎将验证属性放在所有隐藏元素和下拉列表,单选按钮等上.我没有在该模型的验证配置中指定这个,所以我猜它是默认的. ..

<input type="hidden" value="1" name="Id" id="Id" data-val-required="&amp;#39;Id&amp;#39; must not be empty." data-val-number="The field Id must be a number." data-val="true">
Run Code Online (Sandbox Code Playgroud)

验证有效,因为隐藏元素总是有值,但我有单选按钮的问题.例如,如果我不想在默认情况下总是选择一个单选按钮但是为空,如果我想在该项上放置验证规则,则渲染会将默认验证属性放在我的规则之上,因此它会搞砸和验证不能正常工作......

任何人都有类似的问题或者对此有所了解,或者我是否必须自行查看ASP.NET MVC源代码?:)

半懒惰和按推迟最小的编码器

编辑:

我尝试从这个链接提出解决方案:

流畅的验证.错误:不显眼的客户端验证规则中的验证类型名称必须是唯一的

但无论AddImplicitRequiredAttribute设置如何,asp.net mvc都会在每个字段上发出必需的属性...

Dar*_*rov 6

使Id视图模型上的属性成为可以为null的整数.

所以代替:

public int Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

你应该使用:

public int? Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

对于您不希望需要的任何其他值类型,也是如此.你应该使用可空类型.

Html帮助程序自动data-val为所有非可空类型发出属性,这是设计的,如果您不想要这种行为,则必须编写自己的自定义HTML帮助程序来生成输入字段和下拉列表.您不能再依赖TextBoxFor和DropDownListFor帮助程序了解它们的设计方式.

  • @Marko,引擎的工作方式是它自动为所有非可空类型发出data-val属性,这是设计的,如果你不想要这种行为,你将不得不编写自己的自定义HTML助手来生成输入字段和下拉菜单.您不能再依赖TextBoxFor和DropDownListFor帮助程序了解它们的设计方式.所以你可能不同意修改你的视图模型,但我担心这是你唯一的机会.这也正是视图模型的设计目的:满足视图的要求.在这种情况下,视图要求您使用`int?`. (3认同)