Проверка на стороне клиента не работает при наследовании от RequiredAttribute в ASP.NET MVC 3? - PullRequest
5 голосов
/ 20 января 2011

Я создал такой унаследованный атрибут в ASP.NET MVC3:

public sealed class RequiredFromResourceAttribute : RequiredAttribute
{
    public RequiredFromResourceAttribute(string errorResourceName, string errorResourceTypeName)
    {
        this.ErrorMessageResourceName = errorResourceName;
        this.ErrorMessageResourceType = Type.GetType(errorResourceTypeName);
    }
}

И использовал его так:

[RequiredFromResource("Title", "Resources.Resource, MyProject.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")]
public string Title { get; set; }

Он не работал, и MVC проигнорировал его,Затем я создаю более простой класс, который просто унаследован от RequiredAttribute, вот так:

public class MyRequiredAttribute : RequiredAttribute
{
}

Я использую его так, как я сказал.Но это снова не сработало.

Хотя все эти способы отлично работают с "DisplayNameAtrribute".

В чем проблема?

Ответы [ 2 ]

3 голосов
/ 12 апреля 2012

Вы можете исправить это, добавив следующий код в Global.asax: (нашел ответ здесь )

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredLocalizableAttribute), typeof(RequiredAttributeAdapter));

В качестве альтернативы, используя решение Марсинда, я обнаружил, что для конструктора ModelClientValidationRequiredRule требуется сообщение об ошибке. Вот обновленная версия, которая включает отображаемое имя для поля:

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        string msg = FormatErrorMessage(metadata.GetDisplayName());
        yield return new ModelClientValidationRequiredRule(msg);
    }
3 голосов
/ 22 января 2011

Это только проверка на стороне клиента, которая не работает с унаследованными атрибутами. Причиной этого является то, что MVC использует строгое равенство типов при сопоставлении атрибутов на стороне сервера с поведением проверки клиента.

Чтобы обойти это, вам понадобится ваш собственный атрибут для реализации IClientValidatable:

public class MyRequiredAttribute : IClientValidatable {
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
         yield return new ModelClientValidationRequiredRule();
    }
}
...