2

我正在开发一个应用程序,它应该根据保存在数据库中的一些元数据来验证模型。这样做的目的是允许管理员根据客户的偏好更改某些模型的验证方式,而无需更改代码。这些更改适用于整个应用程序,而不是访问它的特定用户。怎么改,暂时不重要。它们可以直接在数据库上修改,也可以使用应用程序进行修改。这个想法是它们应该是可定制的。

假设我有模型“Person”,其属性“Name”为“string”类型。

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

我的应用程序使用此模型,该应用程序分布并安装在多个服务器上。他们每个人都是独立的。一些用户可能希望名称最多包含 30 个字母并且在创建新的“Person”时是必需的,其他用户可能希望它有 25 个而不是必需的。通常,这将使用数据注释来解决,但这些是在编译时评估的,并且以某种方式“硬编码”。

很快,我想找到一种方法来自定义模型的验证方式并将其存储在数据库中,而无需更改应用程序代码。

此外,最好使用 jquery 验证并尽可能少地请求数据库(/服务)。除此之外,我不能使用任何已知的 ORM,如 EF。

4

1 回答 1

1

您可以创建一个自定义验证属性,通过检查存储在数据库中的元数据进行验证。自定义验证属性易于创建,只需扩展System.ComponentModel.DataAnnotations.ValidationAttribute和覆盖该IsValid()方法。

要获得适用于 jQuery 验证的客户端规则,您需要为扩展的自定义验证属性的类型创建一个自定义适配器System.Web.Mvc.DataAnnotationsModelValidator<YourCustomValidationAttribute>。然后这个类需要在OnApplicationStart()你的方法中注册Global.asax

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

于 2013-08-20T12:57:35.750 回答