ASP.NET MVC启用自定义验证属性

时间:2013-10-28 14:58:42

标签: asp.net-mvc-3 validation sitecore data-annotations

我正在尝试为ASP.NET MVC项目创建自己的模型验证属性。我遵循了this question的建议,但看不到如何让@Html.EditorFor()识别我的自定义属性。我是否需要在web.config中的某处注册我的自定义属性类?对此this answer的评论似乎也在问同样的问题。

仅供参考我创建自己的属性的原因是因为我想从Sitecore检索字段显示名称和验证消息,并且不想真正想要创建具有大量静态方法的类的路径表示每个文本属性,如果我使用

,这就是我必须要做的
public class MyModel
{
    [DisplayName("Some Property")]
    [Required(ErrorMessageResourceName="SomeProperty_Required", ErrorMessageResourceType=typeof(MyResourceClass))]
    public string SomeProperty{ get; set; }
}

public class MyResourceClass
{
    public static string SomeProperty_Required
    {
        get { // extract field from sitecore item  }
    }

    //for each new field validator, I would need to add an additional 
    //property to retrieve the corresponding validation message
}

1 个答案:

答案 0 :(得分:1)

这个问题已在这里得到解答:

  

How to create custom validation attribute for MVC

为了使您的自定义验证器属性起作用,您需要注册它。这可以使用以下代码在Global.asax中完成:

public void Application_Start()
{
    System.Web.Mvc.DataAnnotationsModelValidatorProvider.RegisterAdapter(
        typeof (MyNamespace.RequiredAttribute),
        typeof (System.Web.Mvc.RequiredAttributeAdapter));
}

(如果您使用的是WebActivator,则可以将上述代码放入App_Start文件夹中的启动类中。)

我的自定义属性类如下所示:

public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
    private string _propertyName;

    public RequiredAttribute([CallerMemberName] string propertyName = null)
    {
        _propertyName = propertyName;
    }

    public string PropertyName
    {
        get { return _propertyName; }
    }

    private string GetErrorMessage()
    {
        // Get appropriate error message from Sitecore here.
        // This could be of the form "Please specify the {0} field" 
        // where '{0}' gets replaced with the display name for the model field.
    }

    public override string FormatErrorMessage(string name)
    {
        //note that the display name for the field is passed to the 'name' argument
        return string.Format(GetErrorMessage(), name);
    }
}