KeyNotFoundException из файла cshtml

Я использую Razor в своем приложении asp.net. С моего контроллера я поместил в ViewBag словарь вроде этого:

Dictionary<int, RisposteUtente> mappaRisposte = (Dictionary<int, RisposteUtente>)Session["mappaRisposte"];
            if (mappaRisposte == null)
                mappaRisposte = new Dictionary<int, RisposteUtente>();
            ViewBag.mappaRisposte = mappaRisposte;

Итак, я хочу получить значение этого словаря из файла cshtml. Итак, я создаю этот код:

        var oggetto = ((Dictionary<int, AnalisiHRVElaborazioni.Models.Response.RisposteUtente>)ViewBag.mappaRisposte)[x.rowId];
        if (oggetto != null)
        {
               <script>
                   alert("oggetto " + oggetto.valore);
               </script>

        }

Итак, если я попытаюсь запустить этот код, у меня будет эта ошибка:

Exception detail: System.Collections.Generic.KeyNotFoundException: The specified key was not present in the dictionary.

Итак, как я могу справиться с этой ситуацией?


person bircastri    schedule 15.01.2020    source источник


Ответы (2)


В сообщении об ошибке указано, что указанный ключ не найден. Скорее всего, вы передаете значение из x.rowId, которое недействительно/не существует в словаре; это в основном похоже на ошибку индекса массива за пределами. Сначала вы должны проверить, существует ли ключ:

var dictionary = ((Dictionary<int, AnalisiHRVElaborazioni.Models.Response.RisposteUtente>)ViewBag.mappaRisposte);
var oggetto = dictionary.ContainsKey(x.rowId) ? dictionary[x.rowId] : null;

У вас уже есть нулевая проверка, поэтому это должно решить вашу проблему.

person gabriel.hayes    schedule 15.01.2020

Или вы можете использовать метод TryGetValue для проверки нулевого ключа.

вместо этого

var value = myDict[myKey];

изменить на

if (!myDict.TryGetValue(myKey, out data)) {
    Debug.LogError("myDict doesn't have the value");
}
else {
    //do whatever you were planning to do
}

в вашем случае

var myDict = (Dictionary<int, RisposteUtente>)ViewBag.mappaRisposte;
var oggetto = myDict.TryGetValue(x.rowId, out data) ? data : null;
person daremachine    schedule 15.01.2020