2017-01-25 37 views
4

我遇到了以下問題:https://github.com/aspnet/Mvc/issues/4989,並基於2016年9月12日「rsheptolut」評論,他發現這種解決方法(粘貼爲方便起見):如何獲取ModelState中的某個特定屬性的錯誤?

<form class="form-horizontal" asp-antiforgery="true"> 
    <fieldset> 
    // All of this instead of @Html.ValidationSummary(false) due to a bug in ASP.NET Core 1.0 
    @if ([email protected]) 
    { 
     var errors = ViewData.ModelState.Values.Select(item => item.Errors.FirstOrDefault()?.ErrorMessage).Where(item => item != null); 
     <div class="alert alert-danger"> 
      <span>@Localizer["There are problems with your input:"]</span> 
      <ul> 
       @foreach (var error in errors) 
       { 
        <li>@error</li> 
       } 
      </ul> 
     </div> 
    } 

    // Some actual fields. Don't forget validation messages for fields if you need them (@Html.ValidationMessage) 
    </fieldset> 
</form> 

我的問題是與LINQ得到變量爲errors。我想通過屬性的名稱來過濾這些屬性,因此我的文件上傳元素下列出的錯誤列表將不會包含頁面上其他元素的錯誤。我想要做這樣的事情:

ViewData.ModelState.Values.Where(item => item.Key == "Images").Select...; 

但是,LINQ找不到Key作爲ModelStateEntry類的有效屬性。很公平。但是爲什麼呢,當爲ViewData.ModelState.Values添加快速手錶時,Key屬性是否顯示?

回答

5

假設你想爲媒體資源相關聯的錯誤(或多個)Name

string propertyName = "Name"; 

要獲得的第一個錯誤(這是使用@Html.ValidationSummary()時系統會顯示,您可以使用

string error = ViewData.ModelState.Keys.Where(k => k == propertyName) 
    .Select(k => ModelState[k].Errors[0].ErrorMessage).First(); 

或獲取屬性的所有錯誤

IEnumerable<string> errors = ModelState.Keys.Where(k => k == propertyName) 
    .Select(k => ModelState[k].Errors).First().Select(e => e.ErrorMessage); 

並使用您的foreach正如問題中提到的

+0

謝謝!最後一點是我在找什麼。 :) –

+0

如何獲取ModelState.IsValid爲false的模型屬性? – barnes

+1

@barnes。你可以使用'var errors = ModelState.Keys.Where(k => ModelState [k] .Errors.Count> 0).Select(k => new {propertyName = k,errorMessage = ModelState [k] .Errors [0] .ErrorMessage});'它將列出所有有錯誤的屬性和相關的錯誤信息(但你真的應該問一個新的問題) –

相關問題