Validation ASP MVC 2验证:将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()

我正在编写一个自定义验证属性 它在两个字段之间进行条件验证 当我创建规则时,我无法解决的问题之一是如何通过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代码


所以我在这里请求任何想法

不确定你将如何注入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中声明的函数,但我从未尝试过。