2010-07-22 83 views
0

我写一个自定义的验证属性 它的两个字段 当我创建我的规则之间的条件验证,我解决不了的事情之一是如何传递的javascript通过ValidationParameters代码ASP MVC 2验证:传递Javascript代码到客户端

通常,我只是做 ValidationParameters [ “参数1”] = “{必需的:函数(元件){返回$(” #年龄 “);

VAL()< 13)}”。

但是,MicrosoftMvcJQueryValidation.js例程将此格式化为

Param1 =“{required:function(element){return $(”#age“)。val()< 13;)}”

我可以在Javascript中使用Param1.eval()这将评估并执行代码,但我只想evalute代码并执行后

JSON解析器不解析字符串contening Javascript代码

所以我问这里的任何想法

回答

1

不知道如何按照您所描述的方式注入JavaScript,但您可能需要考虑使用custom validation pattern for ASP.NET MVC 2

重要的部分是ValidationAttribute,DataAnnotationsModelValidator,登记与DataAnnotationsModelValidatorProvider.RegisterAdapter中的Application_Start验证,并在客户端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 */ 
    }; 
}; 
+0

我应该注意,这段代码解决了.NET 3.5中MVC 2中的一个特定问题。在.NET 4.0中不再需要它,因为它们将最小长度属性添加到组件库类中。不过,这给你一个很好的例子,说明如何连接自定义客户端验证以扩展标准的MVC 2客户端验证器。 – 2010-07-23 00:40:41

+0

感谢您的意见 但是,主要问题是如何通过Javascript代码,而不是如何做自定义验证 很多时候,你需要通过这样的验证例程 – user385411 2010-07-23 07:16:54

+0

的Javascript代码明白。我认为,因为浏览器的性质,您可以“注入”JavaScript代码的唯一方法是将JavaScript作为HTML输出的一部分发出。你可以写一个