对于特定属性,如何在ModelState中获得错误?

wes*_*and 8 .net c# linq asp.net-mvc asp.net-core

我遇到了以下问题:https://github.com/aspnet/Mvc/issues/4989,并根据2016年9月12日的'rsheptolut'评论,他发现了这种解决方法(为方便起见粘贴):

<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 (!@ViewData.ModelState.IsValid)
    {
        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>
Run Code Online (Sandbox Code Playgroud)

我的问题是LINQ获取errors变量.我想通过属性的名称过滤这些,因此我的文件uploads元素下列出的错误列表将不包含页面上其他元素的错误.我想做这样的事情:

ViewData.ModelState.Values.Where(item => item.Key == "Images").Select...;
Run Code Online (Sandbox Code Playgroud)

但是,LINQ找不到Key作为ModelStateEntry类的有效属性.很公平.但是,为什么在添加快速监视时ViewData.ModelState.Values,Key属性会出现?

小智 10

假设你想要错误的错误 Name

string propertyName = "Name";
Run Code Online (Sandbox Code Playgroud)

要获得第一个错误(使用时将显示的内容@Html.ValidationSummary(),您可以使用

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

或获取财产的所有错误

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

并使用您foreach在问题中提到的

  • @barnes.你可以使用`var errors = ModelState.Keys.Where(k => ModelState [k] .Errors.Count> 0).选择(k => new {propertyName = k,errorMessage = ModelState [k] .Errors [0] .ErrorMessage});`它将列出所有有错误的属性,以及相关的错误消息(但你真的应该问一个新问题) (2认同)