Могут ли ASP.Net MVC 2 Custom атрибуты на уровне класса и на уровне свойств быть активными одновременно? - PullRequest
1 голос
/ 16 октября 2011

Я работаю над веб-приложением asp.net mvc 2.У меня есть модель с 3 свойствами:

[IsCityInCountry("CountryID", "CityID"]
public class UserInfo
{
    [Required]
    public int UserID { get; set; }

    [Required]
    public int CountryID { get; set; }

    [Required]
    public int CityID { get; set; }
}

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

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class IsCityInCountry : ValidationAttribute
{
    public IsCityInCountry(string countryIDProperty, string cityIDProperty)
    {
        CountryIDProperty = countryIDProperty;
        CityIDProperty = cityIDProperty;
    }
    public string CountryIDProperty { get; set; }
    public string CityIDProperty { get; set; }

    public override bool IsValid(object value)
    {
        var properties = TypeDescriptor.GetProperties(value);

        var countryID = properties.Find(CountryIDProperty, true).GetValue(value);
        var cityID = properties.Find(CityIDProperty , true).GetValue(value);

        int countryIDInt;
        int.TryParse(countryID.ToString(), out countryIDInt);

        int cityIDInt;
        int.TryParse(cityID.ToString(), out cityIDInt);

        if (CountryBusiness.IsCityInCountry(countryIDInt, cityIDInt))
        {
            return true;
        }

        return false;
    }
}

Когда я публикую форму в своем представлении,и CountryID не введен, в словаре ModelState есть ошибка об этой проблеме.Другой атрибут игнорируется ("IsCityInCountry").Когда я выбираю CountryID и CityID, которых нет в выбранной стране, я получаю соответствующее подтверждающее сообщение об этом, и ModelState имеет другой ключ (который "").Я понимаю, что преимущество имеет атрибуты свойств, а затем атрибуты класса.Мой вопрос;Есть ли способ получить все сообщения проверки одновременно, независимо от того, какие атрибуты задействованы (атрибуты класса или свойства)?Заранее спасибо.

1 Ответ

1 голос
/ 16 октября 2011

ASP.NET MVC не будет выполнять проверку на уровне класса, если имеются ошибки проверки на уровне свойств. Брэд Уилсон объясняет это в своем блоге :

Ранее сегодня мы совершили изменение в MVC 2, которое преобразовало система проверки от проверки ввода до проверки модели.

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

Я бы порекомендовал вам продолжить и проверить FluentValidation.NET , если вы хотите выполнить более продвинутую проверку в приложении ASP.NET MVC. Декларативная проверка просто не соответствует требованиям в сценариях расширенной проверки.

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