2013-08-20 59 views
2

我正在研究應基於保存在數據庫中的某些元數據驗證模型的應用程序。這樣做的目的在於允許管理員根據客戶的偏好更改某些模型的驗證方式,而無需更改代碼。這些更改將應用​​於整個應用程序,而不是針對訪問它的特定用戶。它如何改變,目前無所謂。可以直接在數據庫上修改它們,或者使用應用程序修改它們。這個想法是,他們應該是可定製的。用元數據保存在數據庫中的用戶可自定義驗證

比方說,我有模型「人」與「字符串」類型的屬性「名稱」。

public class Person 
{ 
    public string Name { get; set; } 
} 

這個模型是由我的應用程序使用,它分佈在幾個服務器上,並分佈在幾個服務器上。他們每個人都是獨立的。有些用戶可能希望名稱最多有30個字母,並且在創建新的「人員」時需要,其他人可能希望該名稱有25個字母並且不需要。通常情況下,這可以通過使用數據註釋來解決,但這些將在編譯期間進行評估,並以某種方式「硬編碼」。

不久,我想找到一種方法來定製並存儲在數據庫中,該模型如何驗證,而不需要更改應用程序代碼。

此外,這將是很好的jquery驗證工作,儘可能少的數據庫(/服務)的要求。除此之外,我不能使用任何已知的ORM,如EF。

回答

1

您可以創建一個自定義驗證屬性,通過檢查數據庫中存儲的元數據進行驗證。自定義驗證屬性很容易創建,只需擴展System.ComponentModel.DataAnnotations.ValidationAttribute並覆蓋IsValid()方法。

要獲得與jQuery驗證一起工作的客戶端規則,您需要爲延伸System.Web.Mvc.DataAnnotationsModelValidator<YourCustomValidationAttribute>的自定義驗證屬性類型創建自定義適配器。然後該課程需要在Global.asaxOnApplicationStart()方法中註冊。

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(YourCustomValidationAttribute), typeof(YourCustomAdapter)); 

下面是一個例子適配器:

public class FooAdapter : DataAnnotationsModelValidator<FooAttribute> 
{ 
    /// <summary> 
    /// This constructor is used by the MVC framework to retrieve the client validation rules for the attribute 
    /// type associated with this adapter. 
    /// </summary> 
    /// <param name="metadata">Information about the type being validated.</param> 
    /// <param name="context">The ControllerContext for the controller handling the request.</param> 
    /// <param name="attribute">The attribute associated with this adapter.</param> 
    public FooAdapter(ModelMetadata metadata, ControllerContext context, FooAttribute attribute) 
     : base(metadata, context, attribute) 
    { 
     _metadata = metadata; 
    } 

    /// <summary> 
    /// Overrides the definition in System.Web.Mvc.ModelValidator to provide the client validation rules specific 
    /// to this type. 
    /// </summary> 
    /// <returns>The set of rules that will be used for client side validation.</returns> 
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     return new[] { new ModelClientValidationRequiredRule(
      String.Format("The {0} field is invalid.", _metadata.DisplayName ?? _metadata.PropertyName)) }; 
    } 

    /// <summary> 
    /// The metadata associated with the property tagged by the validation attribute. 
    /// </summary> 
    private ModelMetadata _metadata; 
} 

這也可能是有用的,如果你想異步調用服務器端驗證http://msdn.microsoft.com/en-us/library/system.web.mvc.remoteattribute(v=vs.108).aspx

相關問題