【问题标题】:MVC3 add Field name in Error to Validation SummaryMVC3 将错误中的字段名称添加到验证摘要
【发布时间】:2014-11-21 08:09:42
【问题描述】:

我在我的 MVC 5 应用程序中呈现验证摘要,如下所示:

 @Html.Partial("_ValidationSummary", @ViewData.ModelState)

部分视图代码如下:

@model ModelStateDictionary

<div class="@(Html.ViewData.ModelState.IsValid ? "validation-summary-valid" : "validation-summary-errors") panel panel-danger"
     data-valmsg-summary="true">
    <div class="panel-heading">
        Please, correct the following errors:
    </div>
    <div class="panel-body">
        <ul>
            @foreach (var modelError in Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
            {
                <li>@modelError</li>
                <li>@modelError.ErrorMessage</li> 
            }
        </ul>
    </div>
</div>

这工作得非常好 - 因为错误消息显示在错误的字段中。

但是 - 未添加模型上错误字段的名称 - 所以我有一个用于手机号码、家庭电话和工作电话的字段。如果我将 abc 放入每个字段,然后在我的验证摘要中,我会收到 3 条错误消息,说 "Phone Number is Invalid" 但我想将该字段添加到错误消息中,以便我可以将其添加到错误消息中,用户将知道哪个字段有误?

有没有一种简单的方法来调整我当前的代码来实现这一点?

【问题讨论】:

    标签: c# asp.net-mvc validation razor asp.net-mvc-5


    【解决方案1】:

    您可以使用 ViewData 中的 ModelMetaData 来检索键的显示名称:

    @foreach (var key in ViewData.ModelState.Keys)
    {
        var modelState = ViewData.ModelState[key];
        var property = ViewData.ModelMetadata.Properties.FirstOrDefault(p => p.PropertyName == key);
    
        if (property != null)
        {
            var displayName = property.DisplayName;
    
            foreach (var error in modelState.Errors)
            {
                <li>@displayName: @error.ErrorMessage</li>
            }
        }
        else
        {
            foreach (var error in modelState.Errors)
            {
                <li>@error.ErrorMessage</li>
            }
        }
    }
    

    确保添加

    @using System.Linq
    

    在视图的顶部。

    您还可以使用&lt;label&gt; 允许用户单击显示名称以自动聚焦输入字段:

    <li><label for="@key">@displayName</label>: @error.ErrorMessage</li>
    

    【讨论】:

      【解决方案2】:

      您可以对模型中的每个字段使用数据注释。

      【讨论】:

      • 再详细一点就好了
      • 该字段将通过 ValidationSummary 在 Razor 表单上进行验证。通过如下方式在 Razor 视图中装饰需要验证的字段: [DisplayName("Title")] public string InvariantTitle { get;放;如果该字段未通过验证,则 ValidationSummary 消息将在 UI 上显示的消息中使用“Title”(而不是“Invariant Title”)。表单消息将如下所示:“标题字段是必需的。”
      【解决方案3】:

      你可以试试下面LINQ查询

      foreach (var modEr in ModelState.Select(st => new { Field = st.Key, Errors = st.Value.Errors.Select(er => er.ErrorMessage) }))
          {
              //modEr.Field //Field name
              //modEr.Errors //List of errors
          }
      

      另外还有一个 MVC 定义的 HTML 帮助器来显示验证摘要,参考 http://msdn.microsoft.com/en-us/library/system.web.mvc.html.validationextensions.validationsummary(v=vs.118).aspx

      【讨论】:

      猜你喜欢
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多