2010-07-22 80 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輸出的一部分發出。你可以寫一個