MVC3在“验证摘要错误”中添加字段名称

时间:2014-09-26 10:27:55

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

我在我的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"但我想将该字段添加到错误消息中,以便我可以将该消息添加到用户将知道哪个字段出错?

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

3 个答案:

答案 0 :(得分: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

位于视图的顶部。

您还可以使用<label>允许用户点击显示名称以自动聚焦输入字段:

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

答案 1 :(得分:0)

您可以尝试以下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

答案 2 :(得分:0)

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