свойство c# RazorPages ModelState Errors равно нулю и вызывает исключение

#c# #asp.net-core #razor #.net-5 #rider

Вопрос:

У меня есть приложение RazorPage, и в файле _layout.cshtml у меня есть следующий фрагмент кода:

 @if (ViewData.ModelState[""].Errors.Count > 0)
{
    <div class="alert alert-error">
       <button type="button" class="close" data-dismiss="alert">×</button>
       @Html.ValidationSummary(true, "Errors: ")
    </div>
}
 

Просматривая исходный код Microsoft, может показаться, что свойство Errors никогда не должно быть равно нулю, но вместо этого это не так, на самом деле иногда это свойство равно нулю и, следовательно, без условного доступа с помощью ? об ошибках, подобных этой:

 @if (ViewData.ModelState[""].Errors?.Count > 0)
 

в некоторых случаях это может вызвать исключение NullReferenceException. Есть ли какая-либо ошибка в моем коде? свойство Errors имеет только значение get не установлено:

введите описание изображения здесь

так что, даже если бы я захотел, я не смог бы установить его равным нулю.Почему это происходит? Я просто не могу объяснить это себе. Спасибо

Обновить

Копаясь и снова отлаживая этот код, я понял, что ModelStateEntry с ключом «» равен нулю

  (ViewData.ModelState[""]) is null
 

если ошибка вызвана промежуточным программным обеспечением IdentityServer, а не моими страницами, где я просто использовал пустую строку в качестве ключа. На самом деле, из Asp.Net Основной исходный код у нас есть:

 public ModelStateEntry this[string key]
{
    get
    {
        if (key == null)
        {
            throw new ArgumentNullException(nameof(key));
        }

        TryGetValue(key, out var entry);
        return entry!;
    }
}

public bool TryGetValue(string key, [NotNullWhen(true)] out ModelStateEntry? value)
{
    if (key == null)
    {
        throw new ArgumentNullException(nameof(key));
    }

    var result = GetNode(key);
    if (result?.IsContainerNode == false)
    {
        value = resu<
        return true;
    }

    value = null; // Retunr null if key not found
    return false;
}
 

В этом случае я бы ожидал плюс исключение KeyNotFoundException.

В любом случае, спасибо за помощь.

Решение

В конце концов, поскольку в случае ошибок со страниц я хочу показывать эти типы ошибок в относительном всплывающем окне, в то время как в других случаях я просто хочу показывать сообщения об ошибках IdentityServer, отображаемые на другой странице и использующие объект IS4 ErrorMessage, я просто вставил два условных доступа следующим образом:

введите описание изображения здесь

Единственная «проблема» заключается в том, что разработчик ide продолжает указывать их как съемные. Я открою ошибку на соответствующем сайте.

Спасибо

Обновление для тех, кто проголосовал отрицательно по моему вопросу

введите описание изображения здесь

https://youtrack.jetbrains.com/issue/RSRP-486576

Ответ №1:

Если вы хотите получить количество всех ошибок,попробуйте использовать:

 ViewData.ModelState.Where(n => n.Value.Errors.Count > 0).ToList().Count()
 

Если вы хотите получить все ошибки для свойства,попробуйте использовать:

 ModelState.Keys.Where(k => k == "Name")
     .Select(k => ModelState[k].Errors).First().Select(e => e.ErrorMessage)