@Html.ValidationSummary() — как установить порядок сообщений об ошибках

У меня есть три элемента формы. Мы назовем их RadioA, RadioB и Dropdown. В модели они создаются в этом порядке и представлены в представлении в этом порядке и указываются по мере необходимости с уникальным сообщением об ошибке для каждого. Затем в представлении я использую:

@Html.ValidationSummary()

Но сообщения об ошибках возвращаются:

  • Требуется раскрывающийся список
  • Требуется RadioA
  • Требуется RadioB

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

Любые идеи? Должен ли я просто использовать jQuery и проверять каждый элемент формы по старинке?


person Casey Crookston    schedule 11.06.2015    source источник


Ответы (2)


Я исправляюсь. Ответ, предоставленный mhapps, сработал как шарм. Это последний ответ. Цитирую его:

У меня была эта проблема, и чтобы быстро решить ее, я воссоздал сводку проверки, как указано выше, и использовал ViewBag для хранения ошибок в правильном порядке, ссылаясь на массив упорядоченных имен полей. Не особенно приятно, но самое быстрое, что я мог придумать в то время. Бритва/MVC3.

Код контроллера:

List<string> fieldOrder = new List<string>(new string[] { 
"Firstname", "Surname", "Telephone", "Mobile", "EmailAddress" })
.Select(f => f.ToLower()).ToList();

ViewBag.SortedErrors = ModelState
   .Select(m => new { Order = fieldOrder.IndexOf(m.Key.ToLower()), Error = m.Value})
   .OrderBy(m => m.Order)
   .SelectMany(m => m.Error.Errors.Select(e => e.ErrorMessage))
   .ToArray();

Затем в представлении:

@if (!ViewData.ModelState.IsValid)
{
    <div class="validation-summary-errors">  
    <ul>
        @foreach (string sortedError in ViewBag.SortedErrors)
        {
            <li>@sortedError</li> 
        }
    </ul>
    </div>
}
person Casey Crookston    schedule 11.06.2015

Я думаю, что лучший способ сделать это - упорядочить свойства в вашей модели в том же порядке, в котором вы хотели бы отображать свои сообщения проверки:

public class Ingredients
{
    [Required]
    public string Vegetable { get; set; }
    [Required]
    public string Starch { get; set; }
    [Required]
    public string Meat { get; set; }
    [Required]
    public string Fruit { get; set; }
  }

Это отобразит сообщение в следующем порядке:

  • Обязательное поле Овощи.
  • Поле Крахмал обязательно для заполнения.
  • Поле Мясо обязательно для заполнения.
  • Поле Fruit обязательно для заполнения.

person Harry    schedule 25.10.2017