@Html.ValidationSummary() - 如何设置错误消息的顺序

@Html.ValidationSummary() - how to set order of error messages

我有三个表单元素。我们称它们为 RadioA、RadioB 和 Dropdown。在模型中,它们按该顺序创建,并按该顺序在视图中显示,并根据需要为每个指定一个唯一的错误消息。然后在视图中,我使用:

@Html.ValidationSummary()

但是错误信息又回来了:

On this thread,我了解到我们确实无法控制这些错误消息返回的顺序。一些人就如何破解这个提出了建议,但我无法让他们中的任何一个工作。

有什么想法吗?我应该只使用 jQuery 并以老式的方式验证每个表单项吗?

我的意思是正确的。 mhapps 提供的答案非常有效。这是最后的答案。我引用他的话:

我遇到了这个问题,为了快速解决它,我像上面那样重新创建了验证摘要,并使用 ViewBag 通过引用有序字段名称数组以正确的顺序存储错误。不是特别好,但我当时能想到的最快的事情。 Razor/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>
}

我认为更好的方法是按照您希望显示验证消息的顺序对模型中的属性进行排序:

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; }
  }

这将按以下顺序显示消息:

  • 需要蔬菜田。
  • 淀粉字段是必需的。
  • 肉类字段为必填项。
  • 需要水果字段。