2014-09-26 70 views
2

我呈現在我的MVC 5應用程序驗證摘要如下:MVC3在錯誤添加字段名稱,以驗證摘要

@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",但我想將該字段添加到錯誤消息中,以便我可以將該錯誤消息添加到用戶將知道哪些字段是錯誤的?

有沒有簡單的方法來調整我的當前代碼來實現這一目標?

回答

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

+0

我會建議在公佈這個答案,而不是LINQ聲明的鏈接如下。此外,請參閱http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validation-with-the-data-annotation-validators-cs,以獲得一個顯示模型和HTML的良好示例。 – 2014-09-26 11:09:40

1

你可以用數據說明針對每個字段的在你的模型。

+0

更詳細一點就好了 – Pseudonym 2014-09-26 12:43:36

+0

該字段將通過ValidationSummary在Razor表單上進行驗證。 裝飾在剃刀視圖中需要驗證的字段,如下所示: [DisplayName(「Title」)] public string InvariantTitle {get;組; } 如果該字段未通過驗證,則ValidationSummary消息將在UI上顯示的消息中使用「Title」(而不是「Invariant Title」)。 表單信息如下所示: 「標題字段是必需的」。 – PhillipPDX 2017-02-27 15:14:19

1

可以使用ModelMetaData,在ViewData的發現,檢索鍵的顯示名稱:

@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>