Получите атрибут проверки, который устанавливает для ModelState IsValid значение false

Есть ли способ узнать, какой атрибут проверки вызвал ошибку ModelState.IsValid == false.

Класс А

public class A
{
    [Required(ErrorMessage = "Required")]
    [DataFormat(DataType.Date, "Must be a Date (DD/MM/YEAR)")]
    [NoFutureDate(ErrorMessage = "Future date is not allowed")]
    public DateTime? Date { get; set; }
}

Теперь, когда я публикую форму, в которой вышеупомянутый класс строго типизирован с его представлением, атрибуты проверки будут работать соответственно.

Что, если 1 из 3 атрибутов проверки вернет ошибку, скажем, [NoFutureDate(ErrorMessage = "Future date is not allowed")].

OR

Что делать, если 2 из 3 атрибутов проверки возвращают ошибку, скажем, [NoFutureDate(ErrorMessage = "Future date is not allowed")] и [DataFormat(DataType.Date, "Must be a Date (DD/MM/YEAR)")].

Конечно, моя собственность не прошла проверку.

Вопрос

Есть ли способ узнать, какой атрибут проверки вызвал ошибку? Это [DataFormat] или оба [DataFormat] и [NoFutureDate].


person phougatv    schedule 29.06.2017    source источник
comment
[DataFormat] не является атрибутом проверки (ваш параметр ErrorMessage не имеет смысла)   -  person    schedule 29.06.2017
comment
@StephenMuecke Из 3 упомянутых 2 являются пользовательскими атрибутами проверки.   -  person phougatv    schedule 29.06.2017
comment
Вы хотите знать программно или просто хотите проверить в отладчике?   -  person ediblecode    schedule 29.06.2017
comment
@jumpingcode чисто программно. Поскольку я должен что-то сделать при сбое определенного атрибута проверки.   -  person phougatv    schedule 29.06.2017
comment
@barnes Насколько я знаю, программно вы сможете получить сообщение об ошибке только для данного поля. Затем вам понадобится какой-то переключатель, чтобы определить, какое сообщение об ошибке означает какой атрибут.   -  person ediblecode    schedule 29.06.2017
comment
@jumpingcode Вот о чем я подумал. Но тогда я должен вести запись сообщений об ошибках, а затем искать в этой коллекции сообщения об ошибках, сгенерированные во время выполнения.   -  person phougatv    schedule 29.06.2017
comment
@barnes Да, и это звучит ужасно.   -  person ediblecode    schedule 29.06.2017
comment
@jumpingcode Значит, нет другого пути, кроме того, о котором я уже подумал (это звучит ужасно)   -  person phougatv    schedule 29.06.2017
comment
@barnes Если вы не хотите добавлять флаги в свои сообщения об ошибках, а затем работать с ними, вы можете указать желаемое поведение в фактической реализации вашего класса атрибутов данных. Вам все равно придется иметь дело с аннотациями данных, предоставляемыми .net по умолчанию.   -  person pijemcolu    schedule 29.06.2017


Ответы (2)


Вы можете использовать ModelState.IsValidField("YourField") и ModelState["Date"].Errors.Contains(), чтобы определить, какая из них вызывает ошибку.

public ActionResult Test(YourModel model)
{
    if(!ModelState.IsValidField("Date"))
    {
        var futureDateError = new ModelError("Future date is not allowed");
        var dataFormatError = new ModelError("Must be a Date (DD/MM/YEAR)");

        bool IsFutureDateError = ModelState["Date"].Errors.Contains(futureDateError);
        bool isFormatError     = ModelState["Date"].Errors.Contains(dataFormatError);
    }
    ...... // your code here
}
person hasan    schedule 29.06.2017

Привет. В приведенных ниже способах вы можете программно получить ошибки полей modelstate.

Способ 1:

if (!ModelState.IsValid) 
 {
    var modelErrors = new List<string>();
    foreach (var modelState in ModelState.Values) 
     {
      foreach (var modelError in modelState.Errors)
      {
        modelErrors.Add(modelError.ErrorMessage);
      }
     }

  }

Способ 2:

string Errors = string.Join("; ", ModelState.Values
                                        .SelectMany(x => x.Errors)
                                        .Select(x => x.ErrorMessage));

Спасибо

Картик

person Karthik Elumalai    schedule 29.06.2017