Пользовательская проверка mvc 5 для переменных внутри объекта модели - PullRequest
0 голосов
/ 18 сентября 2018

Я искал этот вопрос в нескольких местах и ​​не смог найти именно то, что ищу.Допустим, у меня есть структура модели MVC:

public class Person {
    [Required] 
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Workers {
    [AgeRequired]
    public Person Pilots { get; set; }
    public Person Chefs { get; set; }
}

, и вот мой код cshtml:

@Model Workers
<div>
    <label asp-for="Pilots.Name"></label>
    <input asp-for="Pilots.Name"></input>
    <span asp-validation-for="Pilots.Name"></span>
</div>
<div>
    <label asp-for="Pilots.Age"></label>
    <input asp-for="Pilots.Age"></input>
    <span asp-validation-for="Pilots.Age"></span>
</div>
<div>
    <label asp-for="Chefs.Name"></label>
    <input asp-for="Chefs.Name"></input>
    <span asp-validation-for="Chefs.Name"></span>
</div>
<div>
    <label asp-for="Chefs.Age"></label>
    <input asp-for="Chefs.Age"></input>
    <span asp-validation-for="Chefs.Age"></span>
</div>

Person - это общий класс Model, содержащий информацию о пилотах или шеф-поварах.Я хочу, чтобы в моем пользовательском атрибуте проверки AgeRequired возраст был обязательным только для пилотов, а не для поваров.Возможно ли это?

Я работаю на бэкэнд-стороне после отправки формы, однако мне бы хотелось, чтобы это было и на переднем конце.Вот мой код для моего атрибута:

    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public class AgeRequiredAttribute: ValidationAttribute, IClientModelValidator
    {
        public override bool IsValid(object value)
        {
            Workers workers = value as Workers;
            return workers.Age > 0;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ClientModelValidationContext context)
        {
            yield return new ModelClientValidationRule("agerequired", "{0} is a required field.");
        }
    }
}

, а вот мой код JavaScript для проверки внешнего интерфейса:

/// <reference path="jquery.validate.js" />  
/// <reference path="jquery.validate.unobtrusive.js" />  
$.validator.addMethod("agerequired",
            function (value, element, parameters) {
                return value > 0;
            });

$.validator.unobtrusive.adapters.add("agerequired", [], function (options) {
    options.rules.agerequired= {};
    options.messages["agerequired"] = options.message;
});

ClientValidationEnabled и UnobstrusiveJavaScriptEnabled оба установлены в true.

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

Заранее благодарю за помощь!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

В качестве альтернативы можно указать возраст человека в базовом классе.

public int? Age { get; set; }

Наследовать шеф-повара и пилота от персонажа.В пилотном режиме укажите значение возраста необязательным - вы, вероятно, захотите убедиться, что они также имеют минимальный возраст, используя аннотации данных

public new int Age { get; set; }

Модель теперь представляет собой список персон.Клиент должен иметь возможность определить, что является необязательным, а что нет

0 голосов
/ 19 сентября 2018

Я действительно смог создать обходной путь для тех, кто заинтересован.

Если вы вставите data-val- [атрибут], который будет сгенерирован MVC, прямо в ваш входной тег или выберите тег, а затем появится сообщение об ошибке, которое вы хотите выбросить, он выполнит проверку интерфейса.и все еще выполняйте проверку на стороне сервера, поскольку MVC заметит, что в сложном объекте есть информация.Это не идеально, но, вероятно, что мне придется сделать.

Например:

@Model Workers
<div>
    <label asp-for="Pilots.Name"></label>
    <input asp-for="Pilots.Name"></input>
    <span asp-validation-for="Pilots.Name"></span>
</div>
<div>
    <label asp-for="Pilots.Age"></label>
    <input asp-for="Pilots.Age" data-val-agerequired="Age is Required for Pilots."></input>
    <span asp-validation-for="Pilots.Age"></span>
</div>
<div>
    <label asp-for="Chefs.Name"></label>
    <input asp-for="Chefs.Name"></input>
    <span asp-validation-for="Chefs.Name"></span>
</div>
<div>
    <label asp-for="Chefs.Age"></label>
    <input asp-for="Chefs.Age"></input>
    <span asp-validation-for="Chefs.Age"></span>
</div>

Будет работать.Это не идеально, но позволяет нам сохранить проверку MVC Back-end в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...