Вопрос по asp.net-mvc-3, .net, asp.net-mvc, data-annotations, c# – ASP.NET MVC: пользовательская проверка с помощью DataAnnotation

104

У меня есть модель с 4 свойствами, которые имеют тип строки. Я знаю, что вы можете проверить длину одного свойства, используя аннотацию StringLength. Однако я хочу проверить длину 4 свойств вместе взятых.

Как MVC способ сделать это с аннотацией данных? I '

я спрашиваю это, потому что яЯ новичок в MVC и хочу сделать это правильно, прежде чем принимать собственное решение.

Взгляните на настоятельно рекомендуемые решения ....dotnetcurry.com/ShowArticle.aspx?ID=776 Niks
Спасибо за ответы. Я'Я проверил бы Свободную Валидацию, никогда не слышал об этом. И Никс, Дарин в основном написал, что объясняет статья по ссылке, которую вы разместили. Итак, спасибо ... Классные вещи! Danny van der Kraan
Вы смотрели на свободную проверку? Он обрабатывает сложные сценарии намного лучше, чем аннотации данных levelnis

Ваш Ответ

6   ответов
20

ExpressiveAnnotations дает вам такую возможность:

[AssertThat("Length(FieldA) + Length(FieldB) + Length(FieldC) + Length(FieldD) > 50")]
public string FieldA { get; set; }
Это великолепно! мои молитвы получили ответ :) Korayem
Удивительно! благодарю вас Plexis Plexis
8

Ответ может быть немного короче:

public class UniqueFileName : ValidationAttribute
{
    private readonly NewsService _newsService = new NewsService();

    public override bool IsValid(object value)
    {
        if (value == null) { return false; }

        var file = (HttpPostedFile) value;

        return _newsService.IsFileNameUnique(file.FileName);
    }
}

Модель:

[UniqueFileName(ErrorMessage = "This file name is not unique.")]

Обратите внимание, что требуется сообщение об ошибке, иначе ошибка будет пустой.

9

Фон:

Проверка модели необходима для гарантии того, что полученные нами данные являются действительными и правильными, чтобы мы могли выполнить дальнейшую обработку с этими данными. Мы можем проверить модель в методе действия. Встроенные атрибуты проверки: Сравнить, Диапазон, Регулярное выражение, Обязательный, StringLength. Однако у нас могут быть сценарии, в которых нам требуются атрибуты проверки, отличные от встроенных.

Пользовательские атрибуты проверки

public class EmployeeModel 
{
    [Required]
    [UniqueEmailAddress]
    public string EmailAddress {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public int OrganizationId {get;set;}
}

Чтобы создать пользовательский атрибут проверки, вам нужно извлечь этот класс из ValidationAttribute.

public class UniqueEmailAddress : ValidationAttribute
{
    private IEmployeeRepository _employeeRepository;
    [Inject]
    public IEmployeeRepository EmployeeRepository
    {
        get { return _employeeRepository; }
        set
        {
            _employeeRepository = value;
        }
    }
    protected override ValidationResult IsValid(object value,
                        ValidationContext validationContext)
    {
        var model = (EmployeeModel)validationContext.ObjectInstance;
        if(model.Field1 == null){
            return new ValidationResult("Field1 is null");
        }
        if(model.Field2 == null){
            return new ValidationResult("Field2 is null");
        }
        if(model.Field3 == null){
            return new ValidationResult("Field3 is null");
        }
        return ValidationResult.Success;
    }
}

Надеюсь это поможет. Ура!

Рекомендации

Код проекта - пользовательский атрибут проверки в ASP.NET MVC3Взломан - ASP.NET MVC 2 Пользовательская проверка
85
Самостоятельно подтвержденная модель

Ваша модель должна реализовывать интерфейсIValidatableObject, Введите код подтверждения вValidate метод:

public class MyModel : IValidatableObject
{
    public string Title { get; set; }
    public string Description { get; set; }

    public IEnumerable<validationresult> Validate(ValidationContext validationContext)
    {
        if (Title == null)
            yield return new ValidationResult("*", new [] { nameof(Title) });

        if (Description == null)
            yield return new ValidationResult("*", new [] { nameof(Description) });
    }
}
</validationresult>

Пожалуйста, обратите внимание: этона стороне сервера Проверка. Это неработать на стороне клиента. Ваша проверка будет выполнена только после отправки формы.

@MikeKingscott спасибо за замечание Andrei
Обратите внимание, что этот метод проверки вызывается только после того, как все атрибуты проверки прошли проверку. Pedro
yield return new ValidationResult ("Название обязательно. ","Заглавие"); добавит имя свойства, полезно при группировке ошибок проверки для отображения при необходимости. Mike Kingscott
спасибо ваше решение помогло мне !! NULL
1

чтобы ответить, но для тех, кто ищет. Вы можете легко сделать это, используя дополнительное свойство с аннотацией данных:

public string foo { get; set; }
public string bar { get; set; }

[MinLength(20, ErrorMessage = "too short")]
public string foobar 
{ 
    get
    {
        return foo + bar;
    }
}

Тот'Все это действительно так. Если вы действительно хотите отобразить в определенном месте ошибку проверки, вы можете добавить это в своем представлении:

@Html.ValidationMessage("foobar", "your combined text is too short")

делать это в представлении может пригодиться, если вы хотите сделать локализацию.

Надеюсь это поможет!

162

public class CombinedMinLengthAttribute: ValidationAttribute
{
    public CombinedMinLengthAttribute(int minLength, params string[] propertyNames)
    {
        this.PropertyNames = propertyNames;
        this.MinLength = minLength;
    }

    public string[] PropertyNames { get; private set; }
    public int MinLength { get; private set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
        var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<string>();
        var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length;
        if (totalLength < this.MinLength)
        {
            return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        }
        return null;
    }
}
</string>

и тогда у вас может быть модель представления и украсить ее одним из ее свойств:

public class MyViewModel
{
    [CombinedMinLength(20, "Bar", "Baz", ErrorMessage = "The combined minimum length of the Foo, Bar and Baz properties should be longer than 20")]
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Baz { get; set; }
}
Это немного поздно, но кто-нибудь знает, есть ли другие настройки, которые вам нужно "включи" для того, чтобы разрешить пользовательские аннотации данных? Я знаю о добавлении пространства имен для ненавязчивого js в файле web.config, но где-нибудь еще? Jose
@DannyvanderKraan, да, это общепринятый способ. Конечно, это так ужасно, что я никогда не использую его и вместо этого использую FluentValidation.NET для проверки. Darin Dimitrov
Согласовано. Спасибо. Я'Я посмотрю в беглую проверку. Danny van der Kraan
выполняет ли этот вид проверки на стороне клиентаCombinedMinLength() Требуется JS будет введен для проверки на стороне клиента? Mou

Похожие вопросы