继本文后,对自定义属性执行客户端验证
我试图了解如何执行此操作,将其他参数传递给客户端脚本
据我所知,到目前为止,使用MVC 3实现自定义验证需要以下内容
基于ValidationAttribute并实现IClientValidatable.我还看到了一些源自ModelValidator的示例,它似乎实现了ValidationAttribute和IClientValidatable的功能.所以这是关于差异是什么或者ModelValidator是否在MVC 2中使用但现在已被弃用或者是什么的第一个混淆点?
必须从GetClientValidationRules()返回ModelClientValidationRule的实例以指定详细信息,例如错误消息,ValidationType(我理解为将执行客户端验证的Javascript函数的名称)以及属性的任何其他自定义参数可能有,并且需要传递给Javascript验证.
我假设运行时(不确定它的哪一部分)然后使用ModelClientValidationRule标签元素生成html属性,如下所示:
data-val="true" (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]
Run Code Online (Sandbox Code Playgroud)
必须使用jQuery.validators.addmethod()创建Javascript函数并将其添加到jQuery.validators,以便JQuery在需要执行时知道它.就像是:
jQuery.validator.addMethod(
'greaterThan',
function (value, element, params) {
/.../
return /* true or false */ ;
},
''
);
Run Code Online (Sandbox Code Playgroud)
我的问题是签名'function(value,element,params)'是否是处理验证的方法的标准,我认为它将在适当的时候被某些jQuery功能调用,例如在提交表单之前或者element会丢失fuces或keyUp事件.我只是不知道如何控制这个,即选择适合自定义验证的事件.
这将不显眼的属性转换为; 我不太清楚,但认为它是一个jQuery规则,但我不清楚这些是如何工作的.就像是
jQuery.validator.unobtrusive.adapters.add(
'futuredate',
{ },
function (options) {
options.rules['greaterThan'] = true;
options.messages['greaterThan'] = options.message;
}
);
Run Code Online (Sandbox Code Playgroud)
我的问题是'功能(选项)'.这是在'function(value,element,params)'之前调用的函数,负责将不显眼的标记提取到jQuery.Validation可以理解的数据结构中.从代码示例中我可以看出,options是一个对象,它包含来自标记的属性值(例如options.message)和它必须映射到的jQuery相关属性(例如options.messages ['ClientSideValidationFunctionName']如果是这样,如何检索和映射自定义参数.
我希望我没有添加任何额外的困惑.
使用MVC3,您可以使用两种新的机制来添加自定义验证.这些是(1)子类ValidationAttribute或(2)实现IValidatableObject.
ValidationAttribute允许您通过实现IClientValidatable(并通过jQuery注册新的适配器和方法)相对简单地添加客户端验证.
IValidatableObject更适合于一次性验证要求,其中重用不是一种选择.它还导致更简单的代码.因此,它是我选择的一些场景.不幸的是,我没有看到使用此方法实现客户端验证的简单方法.
所以问题是我缺少什么以及在使用IValidatableObject时如何获得JS验证?
这更像是一个理论问题.
我目前正在使用ComponentModel.DataAnnotations检查MVC 3验证,一切都在自动运行,特别是在客户端.
某种程度上会检查这些属性,并为验证生成javascript(或html5属性,如果使用不显眼的模式),它可以工作.
我的问题是什么生成客户端javascript以及如何访问和修改它?例如,我想稍微处理给定的dataannotation属性,或处理自定义属性(我发现我可以从ValidationAttribute派生它们,但可能由于某些原因我不想要).
有人可以向我解释一下真正发生了什么吗?(或者链接到好的解释也会很好,因为我只找到了实际使用数据注释的教程)
编辑:此外,从ValidationAttribute派生,客户端验证不会自动运行.为什么?
我在这里问类似的问题,但是在这个问题中我使用了另一个实现,正是这种方式下面的代码显示了我的实现:
模型:
public class Department {
public long Id { get; set; }
[IsDateAfter("Date2", true, ErrorMessage = "O My")]
public DateTime Date1 { get; set; }
public DateTime Date2 { get; set; }
public string Name1 { get; set; }
public string Name2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
自定义验证器:
public sealed class IsDateAfter : ValidationAttribute, IClientValidatable {
private readonly string testedPropertyName;
private readonly bool allowEqualDates;
public IsDateAfter(string testedPropertyName, bool allowEqualDates = false)
{
this.testedPropertyName …Run Code Online (Sandbox Code Playgroud) javascript asp.net-mvc razor unobtrusive-validation asp.net-mvc-3
给定一个如下所示的ViewModel:
public class Login {
[Required]
public string Username { get; set; }
[Required, CustomValidator]
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
像这样的视图(Razor语法在这里):
@Html.TextBoxFor(f => f.Password)
Run Code Online (Sandbox Code Playgroud)
我得到以下标记:
<input type="text"
value=""
data-val-required="This field is required." />
Run Code Online (Sandbox Code Playgroud)
但是我希望它还包含我的自定义验证器的'data-'属性.
我想要这样的东西:
<input type="text"
value=""
data-val-required="This field is required."
data-val-customvalidator="XYZ" />
Run Code Online (Sandbox Code Playgroud)
如何使用ASP.NET MVC 3.0实现这一目标?
例如,我是否需要在自定义验证器上添加一些特殊属性?或者在某处注册?
我刚刚创建了一个示例MVC3应用程序来学习验证.它正在使用DataAnnotations.我创建了一个名为CustomStartLetterMatch 的自定义ValidationAttribute.它正在实现"System.Web.Mvc.IClientValidatable".我有相应的客户端代码用不引人注目的jQuery编写.这是按预期工作的.
关于自定义验证器:它比较第一个名称输入和姓氏输入.如果它们的第一个字符不相同则抛出错误.
正如我所说,该应用程序工作正常.但是当我看着rule.ValidationType = "greaterdate";我感到困惑时.我想将其更改为"anotherDefaultType"之类的其他内容.当我更改它时,它失败并出现jQuery错误.
码:
using System;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
namespace MyValidationTEST
{
public class Person
{
[Required(ErrorMessage = "First name required")]
public string FirstName { get; set; }
[CustomStartLetterMatch("FirstName")]
[StringLength(5,ErrorMessage = "Must be under 5 characters")]
public string LastName { get; set; }
[Range(18,50,ErrorMessage="Must be between 18 and 50")]
public int Age { get; set; }
}
public sealed class CustomStartLetterMatch : ValidationAttribute, System.Web.Mvc.IClientValidatable
{
private const string _defaultErrorMessage …Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×3
validation ×2
asp.net ×1
c# ×1
client-side ×1
javascript ×1
jquery ×1
parameters ×1
razor ×1