Validation ASP MVC 2验证:将Javascript代码传递给客户端
我正在编写一个自定义验证属性 它在两个字段之间进行条件验证 当我创建规则时,我无法解决的问题之一是如何通过ValidationParameters传递javascript代码 通常,我就是这样 ValidationParameters[“Param1”]=“{required:function(element){return$(“#age”).val()<13;)}” 但是,MicrosoftMvcJQueryValidation.js例程将此设置为 Param1=“{required:function(element){return$(“#age”).val()<13;)}” 我可以在Javascript中使用Param1.eval()。这将计算并执行代码,但我只想计算代码并稍后执行 JSON解析器不解析包含字符串的Javascript代码Validation ASP MVC 2验证:将Javascript代码传递给客户端,validation,asp.net-mvc-2,Validation,Asp.net Mvc 2,我正在编写一个自定义验证属性 它在两个字段之间进行条件验证 当我创建规则时,我无法解决的问题之一是如何通过ValidationParameters传递javascript代码 通常,我就是这样 ValidationParameters[“Param1”]=“{required:function(element){return$(“#age”).val()
所以我在这里请求任何想法
不确定你将如何注入JavaScript,但是你可能想考虑使用.< /P> 重要部分包括ValidationAttribute、DataAnnotationsModelValidator、在应用程序_Start中使用DataAnnotationsModelValidatorProvider.RegisterAdapter注册验证器,以及客户端Sys.Mvc.ValidatorRegistry.validators函数集合来注册客户端验证代码 下面是我文章中的示例代码[RegularExpression("[\\S]{6,}", ErrorMessage = "Must be at least 6 characters.")]
public string Password { get; set; }
[StringLength(128, ErrorMessage = "Must be under 128 characters.")]
[MinStringLength(3, ErrorMessage = "Must be at least 3 characters.")]
public string PasswordAnswer { get; set; }
public class MinStringLengthAttribute : ValidationAttribute
{
public int MinLength { get; set; }
public MinStringLengthAttribute(int minLength)
{
MinLength = minLength;
}
public override bool IsValid(object value)
{
if (null == value) return true; //not a required validator
var len = value.ToString().Length;
if (len < MinLength)
return false;
else
return true;
}
}
public class MinStringLengthValidator : DataAnnotationsModelValidator<MinStringLengthAttribute>
{
int minLength;
string message;
public MinStringLengthValidator(ModelMetadata metadata, ControllerContext context, MinStringLengthAttribute attribute)
: base(metadata, context, attribute)
{
minLength = attribute.MinLength;
message = attribute.ErrorMessage;
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRule
{
ErrorMessage = message,
ValidationType = "minlen"
};
rule.ValidationParameters.Add("min", minLength);
return new[] { rule };
}
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MinStringLengthAttribute), typeof(MinStringLengthValidator));
}
Sys.Mvc.ValidatorRegistry.validators["minlen"] = function(rule) {
//initialization
var minLen = rule.ValidationParameters["min"];
//return validator function
return function(value, context) {
if (value.length < minLen)
return rule.ErrorMessage;
else
return true; /* success */
};
};
[RegularExpression(“[\\S]{6,}”,ErrorMessage=“必须至少包含6个字符。”)]
公共字符串密码{get;set;}
[StringLength(128,ErrorMessage=“必须少于128个字符。”)]
[MinStringLength(3,ErrorMessage=”必须至少包含3个字符。“)]
公共字符串密码应答{get;set;}
公共类MinStringLengthAttribute:ValidationAttribute
{
public int MinLength{get;set;}
公共MinStringLengthAttribute(int minLength)
{
MinLength=MinLength;
}
公共覆盖布尔值有效(对象值)
{
if(null==value)返回true;//不是必需的验证器
var len=value.ToString().Length;
if(长度<最小长度)
返回false;
其他的
返回true;
}
}
公共类MinStringLengthValidator:DataAnnotationsModelValidator
{
int minLength;
字符串消息;
公共MinStringLengthValidator(ModelMetadata元数据、ControllerContext上下文、MinStringLengthAttribute属性)
:base(元数据、上下文、属性)
{
minLength=attribute.minLength;
message=attribute.ErrorMessage;
}
公共重写IEnumerable GetClientValidationRules()
{
var规则=新ModelClientValidationRule
{
ErrorMessage=消息,
ValidationType=“minlen”
};
rule.ValidationParameters.Add(“min”,minLength);
返回新的[]{rule};
}
}
受保护的无效应用程序\u Start()
{
注册地址(RouteTable.Routes);
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MinStringLengthAttribute),typeof(MinStringLengthValidator));
}
Sys.Mvc.ValidatorRegistry.validators[“minlen”]=函数(规则){
//初始化
var minLen=rule.ValidationParameters[“min”];
//返回验证器函数
返回函数(值、上下文){
if(value.length
我应该注意,这段代码解决了.NET 3.5上的MVC 2中的一个特定问题。在.NET 4.0中不再需要它,因为它们将最小长度属性添加到组件库类中。不过,这为您提供了一个很好的示例,说明了如何连接自定义客户端验证以扩展标准MVC 2客户端验证程序。谢谢您的指教但是,主要的问题是如何传递Javascript代码,而不是如何经常进行自定义验证,您需要在这样的验证过程中传递Javascript代码。我认为唯一可以“注入”的方法由于浏览器的性质,javascript代码是将javascript作为HTML输出的一部分发出的。您可以向DOM编写一个脚本,然后调用DOM中声明的函数,但我从未尝试过。