Nie można wykonać powiązania środowiska uruchomieniowego na odwołaniu o wartości null, ale NIE jest to odwołanie o wartości null

80

przy użyciu: MVC 4, ASP.NET Razor

Otrzymuję błąd, który wygląda na to, że nie powinno to być możliwe. Mówi mi, że używam odniesienia zerowego, States, ale wyraźnie jest ono ustawiane.

Kontroler:

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();
}

Widok:

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

Błąd:

Cannot perform runtime binding on a null reference
Line 54: @foreach (KeyValuePair<int, string> de in ViewBag.States)
generalcoder
źródło
3
Czy na pewno najpierw poprawnie przechodzi przez twoją metodę?
Jon Skeet
1
Umieść punkty przerwania w swojej Index()metodzie i widoku i zobacz, czy to pomoże Ci zobaczyć, co jest nie tak.
Tim S.
3
Znalazłem własną odpowiedź, wszystko było w porządku, w moim widoku miałem literówkę na zupełnie niepowiązanym obiekcie, miałem ViewBag.TypoObject <- to spowodowało, że wszystko się pomieszało
generalcoder

Odpowiedzi:

108

Znalezione rozwiązanie: miałem w widoku literówkę, ViewBag.Typo <- to spowodowało błąd, ale debugger umieścił wyjątek w nieistotnym miejscu.

generalcoder
źródło
11
Po prostu miałem ten sam problem, w którym debugger umieszczał wyjątek w niewłaściwym punkcie widoku. W dalszej części miałem zerowe odniesienie.
user1616625
5
Bardzo irytująca cecha. Mam na myśli naprawdę, debugger, jeśli nie wiesz, co i gdzie jest problem to faktycznie sprawia, że rzeczy trudniejsze , gdy udajesz robisz.
glenatron
2
Arggggg! Właśnie spędziłem nad tym godzinę! Miał częściowy widok, który był używany w kilku miejscach różnic ... Model został wygenerowany dokładnie tak samo, ale zawierał błąd, gdy był odwoływany z jednego wyniku działania, a nie drugiego. Skończyło się również na problemie z ViewBag. Akcja rozgrywała się w jednej akcji, a nie w drugiej. DENERWUJĄCY!!!
ajzeffer
To też zaoszczędziło mi trochę czasu. Miałem podobny problem, gdy uzyskiwałem dostęp do właściwości ViewBag, która już nie istniała, ale błąd `` Nie można wykonać powiązania środowiska uruchomieniowego na odwołaniu zerowym '' sprawił, że wyglądało to tak, jakby miało to miejsce w niepowiązanej części kodu.
Chris Morgan,
8
czekaj - jaka była literówka?
Cullub
16

Ten błąd występuje, gdy masz ViewBag Non-Existent w kodzie maszynki do golenia wywołującym metodę.

Kontroler

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

brzytwa:

<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>

Z jakiegoś powodu .net nie jest w stanie pokazać błędu w prawidłowym wierszu.

Zwykle powoduje to dużo straconego czasu.

AFetter
źródło
13

Ten wyjątek jest również generowany, gdy nieistniejąca właściwość jest aktualizowana dynamicznie przy użyciu odbicia.

Jeśli używa się odbicia do dynamicznego aktualizowania wartości właściwości, warto sprawdzić, czy przekazana wartość PropertyNamejest identyczna z rzeczywistą właściwością.

W moim przypadku próbowałem zaktualizować Employee.firstName, ale w rzeczywistości właściwość była Employee.FirstName.

Warto o tym pamiętać. :)

XtraSimplicity
źródło
5

Moim rozwiązaniem tego błędu było skopiowanie i wklejenie z innego projektu, który miał odniesienie do @Model.Id. Ta konkretna strona nie miała modelu, ale linia błędu była tak daleko od rzeczywistego błędu, że nigdy jej nie znalazłem!

Eonasdan
źródło
1

Musisz zdefiniować stany różne od null.

@if (ViewBag.States!= null)
{
    @foreach (KeyValuePair<int, string> de in ViewBag.States)
    {
        value="@de.Key">@de.Value 
    }
}                                
Cuteboy_Max
źródło
-4

Zestaw

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

jako właściwość poza funkcją i wewnątrz funkcji wstaw wpisy, powinno działać.

Alexandre
źródło
1
Oh, co? Właściwości kontrolera nie są dostępne z widoku, dlatego jest ViewBag i / lub ViewModel ...
Thomas Levesque
2
Nie ma absolutnie nic złego w używaniu inicjatora kolekcji. To NIE rozwiąże problemu.
David L