2017-01-25 1 views
4

Я сталкиваюсь следующий вопрос: https://github.com/aspnet/Mvc/issues/4989, и на основе «» rsheptolut комментарий сен 12, 2016 г., он нашел обходной путь (вставили для удобства):Как вы получаете ошибки в 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 не находит ключ в качестве действительного свойства класса ModelStateEntry. Справедливо. Но почему тогда, когда добавляются быстрые часы до ViewData.ModelState.Values, появляется свойство Key?

ответ

5

Предполагая, что вы хотите, чтобы погрешность (ы) для proeprty 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). Выбрать (k => new {propertyName = k, errorMessage = ModelState [k] .Errors [0] .ErrorMessage}); ', в котором будут перечислены все свойства с ошибкой и связанное с ними сообщение об ошибке (но вы действительно должны задавать новый вопрос) –

Смежные вопросы