Неможливо виконати прив'язку часу виконання для нульового посилання, але це НЕ посилання нуля


80

за допомогою: MVC 4, ASP.NET Razor

Я отримую повідомлення про помилку, схоже, це не повинно бути можливим. Це говорить мені, що я використовую нульове посилання, держави, але явно воно встановлюється.

Контролер:

public ActionResult Index()
{
    Dictionary<int, string> states = new Dictionary<int, string>()
    {
        { -1, "a"},
        { 0, "b"},
        { 1, "c"},
        { 2, "d"},
    };

    //assigning states
    ViewBag.States = states;

    foreach (KeyValuePair<int, string> de in ViewBag.States)
    {
        Debug.WriteLine(de.Key);
    }
    return View();
}

Вид:

<div class="search-input">
    <select>
        @foreach (KeyValuePair<int, string> de in ViewBag.States)
        {
            <option value="@de.Key">@de.Value</option>
        }
    </select>
</div>

Помилка:

Cannot perform runtime binding on a null reference
Line 54: @foreach (KeyValuePair<int, string> de in ViewBag.States)

3
Ви впевнені, що спочатку правильно пройшов ваш метод?
Джон Скіт,

1
Введіть точки зупинку у своєму Index()методі та поданні та перевірте, чи допомагає це зрозуміти, що не так.
Тім С.

3
Знайдено мій власний відповідь, все було правильно, на мою думку , я була помилка на абсолютно непов'язаних об'єкта, я мав ViewBag.TypoObject <- це викликало все , щоб отримати переплуталися
generalcoder

Відповіді:


108

Знайдене рішення: На мою думку, у мене була помилка, ViewBag.Typo <- це спричинило помилку, але налагоджувач розмістив виняток у недоречному місці.


11
Просто була та сама проблема, коли налагоджувач ставив виняток у неправильну точку зору. У мене було нульове посилання нижче.
user1616625

5
Дуже дратує риса. Я маю в виду на насправді, відладчик, якщо ви не знаєте , що і де проблема на насправді робить речі важче , коли ви робите вигляд , що ви робите.
glenatron

2
Arggggg! Щойно витратив на це годину! Мав частковий вигляд, який використовувався в декількох місцях ... Модель була створена ТОЧНО такою ж, але помилялася при посиланні з одного результату дії, а не з іншого. Це також стало проблемою ViewBag. Це було встановлення в одній дії, а не в іншій. ФРУСТРАЦІЯ !!!
ajzeffer

Це заощадило і мені трохи часу. У мене була подібна проблема, коли я отримував доступ до властивості ViewBag, яка більше не існувала, але помилка "Неможливо виконати прив'язку до виконання за нульовим посиланням" зробила вигляд, ніби це трапляється із не пов'язаною частиною коду.
Chris Morgan,

8
почекайте - яка була помилка?
Куллуб,

16

Ця помилка трапляється, коли у вашому коді бритви ViewBag не існує, викликаючи метод.

Контролер

public ActionResult Accept(int id)
{
    return View();
}

бритва:

<div class="form-group">
      @Html.LabelFor(model => model.ToId, "To", htmlAttributes: new { @class = "control-label col-md-2" })
     <div class="col-md-10">
           @Html.Flag(Model.from)
     </div>
</div>
<div class="form-group">
     <div class="col-md-10">
          <input value="@ViewBag.MaximounAmount.ToString()" />@* HERE is the error *@ 
     </div>
</div>

З якоїсь причини .net не може показати помилку у правильному рядку.

Зазвичай це спричиняє велику втрату часу.


13

Цей виняток також виникає, коли неіснуюче властивість оновлюється динамічно за допомогою відображення.

Якщо хтось використовує відображення для динамічного оновлення значень властивостей, варто перевірити, щоб переконатися, що передані PropertyName ідентичне фактичному властивості.

У моєму випадку я намагався оновити Employee.firstName, але властивість насправді булоEmployee.FirstName .

Варто мати на увазі. :)


5

Моє рішення цієї помилки полягало в тому, що скопіюйте та вставте з іншого проекту, на який було посилання @Model.Id. Ця конкретна сторінка не мала моделі, але рядок помилок був настільки далекий від фактичної помилки, що я її ніколи не знайшов!


1

Ви повинні визначити стани, не рівні нулю ..

@if (ViewBag.States!= null)
{
    @foreach (KeyValuePair<int, string> de in ViewBag.States)
    {
        value="@de.Key">@de.Value 
    }
}                                

-4

Встановити

 Dictionary<int, string> states = new Dictionary<int, string>()

як властивість поза функцією і всередині функції вставляйте записи, вона повинна працювати.


1
Ну що? Властивості контролера недоступні з подання, тому є ViewBag та / або ViewModel ...
Thomas Levesque

2
У використанні ініціалізатора колекції немає абсолютно нічого поганого. Це НЕ вирішить проблему.
Девід Л
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.