Условно проверяющие части Модели MVC ASP.NET с DataAnnotations?

Часть Вашего вопроса имеет дефектное предположение. Вы предполагаете, что у нас есть выбор языка. В весь из проектов я работаю над который C++ использования, нет никакого реального выбора. Это - проекты, которые существовали, так как значительно прежде я присоединился к компании и был записан в C++. У них есть много лет истории позади них и соответствующего объема кода.

я думаю, что это - крупнейшие люди ошибки, делают, когда они скажут, что "C++ умрет" или, "почему люди все еще используют C++?". Я определенно соглашаюсь, что, за исключением системных программ уровня, Вы не собираетесь видеть много/любых новые проекты запуститься в C++. По моему скромному мнению, это не имеет много смысла. Не обязательно из-за свойственных отказов на языке, но все больше более трудно найти людей, которые хорошо работают при кодировании C++.

, Что люди часто забывают рассматривать, миллионы (миллиарды?) строк C++, которые выполняют наш мир сегодня. Переключение на другой язык чрезвычайно дорогостоящее и не может быть сделано на прихоти. Это берет огромное выравнивание для помещения времени и усилия в перезапись приложений того размера. Поэтому C++ не умрет. По крайней мере в ближайшее время.

9
задан Community 23 May 2017 в 12:09
поделиться

6 ответов

Для CheckoutModel я использую этот подход (большинство полей скрыто):

[ModelBinder(typeof(CheckoutModelBinder))]
public class CheckoutModel : ShoppingCartModel
{        
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public bool ShipToBillingAddress { get; set; }
}

public class Address
{
    [Required(ErrorMessage = "Email is required")]
    public string Email { get; set; }

    [Required(ErrorMessage = "First name is required")]
    public string FirstName { get; set; }

    [Required()]
    public string LastName { get; set; }

    [Required()]
    public string Address1 { get; set; }
}

Связыватель пользовательской модели удаляет все ошибки ModelState для полей, начинающихся с «ShippingAddress», если они обнаруживаются. Тогда «TryUpdateModel ()» вернет истину.

    public class CheckoutModelBinder : DefaultModelBinder
    {
        protected override void OnModelUpdated(ControllerContext controllerContext,
                                               ModelBindingContext bindingContext) {

            base.OnModelUpdated(controllerContext, bindingContext);

            var model = (CheckoutModel)bindingContext.Model;

            // if user specified Shipping and Billing are the same then 
            // remove all ModelState errors for ShippingAddress
            if (model.ShipToBillingAddress)
            {
                var keys = bindingContext.ModelState.Where(x => x.Key.StartsWith("ShippingAddress")).Select(x => x.Key).ToList();
                foreach (var key in keys)
                {
                    bindingContext.ModelState.Remove(key);
                }
            }
        }    
    }

Есть ли лучшие решения?

6
ответ дан 4 December 2019 в 13:48
поделиться

Убедитесь, что поля, которые вы не хотите проверять, не отправлены в действие. Мы проверяем только те поля, которые были фактически опубликованы.

Изменить: (от вопрошающего)

Это поведение было изменено в MVC2 RC2:

Система проверки по умолчанию проверяет вся модель Проверка по умолчанию система в ASP.NET MVC 1.0 и в предварительные версии ASP.NET MVC 2 до RC 2 проверены только те свойства модели, которые были отправлены на сервер. В ASP.NET MVC 2, новое поведение заключается в том, что все свойства модели проверяются, когда модель проверена, независимо от было ли опубликовано новое значение. Приложения, зависящие от Для поведения ASP.NET MVC 1.0 может потребоваться изменения. Для получения дополнительной информации о это изменение, см. запись Ввод Проверка и проверка модели в ASP.NET MVC в блоге Брэда Уилсона.

2
ответ дан 4 December 2019 в 13:48
поделиться

Я вижу ваше затруднительное положение. Я ищу другие решения для проверки также в отношении сложных правил проверки, которые могут применяться к более чем одному свойству данного объекта модели или даже ко многим свойствам из разных объектов модели в графе объектов (если вам не повезло проверять связанные объекты

Ограничение интерфейса IDataErrorInfo состоит в том, что объект модели удовлетворяет допустимому состоянию просто тогда, когда ни одно из свойств не содержит ошибок. Это означает, что действительный объект - это объект, все его свойства также действительны . Однако у меня может возникнуть ситуация, когда если свойство A, B и C действительны - тогда действителен весь объект .. , но также , если свойство A недействительно, но B и C верны, тогда объект удовлетворяет действительности. У меня просто нет способа описать это условие / правило с помощью атрибутов IDataErrorInfo interface / DataAnnotations .

Итак, я нашел этот подход делегирования . Многие полезные усовершенствования в MVC не существовали на момент написания этой статьи, но основная концепция должна вам помочь. Вместо того, чтобы использовать атрибуты для определения условий проверки объекта, мы создаем функции-делегаты, которые проверяют более сложные требования, и, поскольку они делегированы, мы можем их повторно использовать. Конечно, это больше работы, и написание пользовательских блоков кода для правил проверки позволит включить условия перекрестных свойств (например, указанное вами условие, когда если ваше свойство ShippingSameAsBilling истинно, то вы можете игнорировать другие правила для адреса доставки, и т. д.)

DataAnnotations служит для упрощения простых правил проверки объектов с очень небольшим кодом. Но по мере развития ваших требований вам нужно будет проверять более сложные правила. Новые виртуальные методы в связывателе модели MVC2 должны и дальше предоставлять нам способы интеграции наших будущих изобретений для валидации в структуру MVC.

DataAnnotations служит для упрощения простых правил проверки для объектов с очень небольшим кодом. Но по мере развития ваших требований вам нужно будет проверять более сложные правила. Новые виртуальные методы в связывателе модели MVC2 должны продолжать предоставлять нам способы интеграции наших будущих изобретений для проверки в структуру MVC.

DataAnnotations служит для упрощения простых правил проверки для объектов с очень небольшим кодом. Но по мере развития ваших требований вам нужно будет проверять более сложные правила. Новые виртуальные методы в связывателе модели MVC2 должны продолжать предоставлять нам способы интеграции наших будущих изобретений для проверки в структуру MVC.

2
ответ дан 4 December 2019 в 13:48
поделиться

Для более сложных случаев я отошел от простых DataAnnotations к следующему: Проверка с помощью посетителей и методов расширения .

Если вы хотите использовать свои DataAnnotations, вы должны заменить что-то вроде следующего:

public IEnumerable<ErrorInfo> BrokenRules (Payment payment)
{   
    // snip... 
    if (string.IsNullOrEmpty (payment.CCName))
    {
      yield return new ErrorInfo ("CCName", "Credit card name is required");
    }
}

методом проверки свойства по имени через DataAnnotations (которого у меня нет банкомата).

1
ответ дан 4 December 2019 в 13:48
поделиться

Это не связано с DataAnnotations , но смотрели ли вы проект Fluent Validation ? Это дает вам точный контроль над вашей проверкой, и если у вас есть проверка от объекта к объекту, вам поможет объединенный объект из двух объектов.

Также кажется, что он был построен с учетом MVC, но он также имеет свои собственная « среда выполнения », чтобы вы могли использовать ее и в других приложениях .NET, что является еще одним бонусом в моей книге.

0
ответ дан 4 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

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