Es kann keine Laufzeitbindung für eine Nullreferenz durchgeführt werden, es handelt sich jedoch NICHT um eine Nullreferenz

79

Verwenden von: MVC 4, ASP.NET Razor

Ich erhalte eine Fehlermeldung, die anscheinend nicht möglich sein sollte. Es sagt mir, dass ich eine Nullreferenz verwende, States, aber es wird eindeutig gesetzt.

Regler:

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

Die Aussicht:

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

Der Fehler:

Cannot perform runtime binding on a null reference
Line 54: @foreach (KeyValuePair<int, string> de in ViewBag.States)
Generalcoder
quelle
3
Sind Sie sicher, dass Ihre Methode zuerst korrekt durchlaufen wird?
Jon Skeet
1
Fügen Sie Haltepunkte in Ihre Index()Methode und die Ansicht ein und prüfen Sie, ob Sie dadurch besser erkennen können, was falsch ist.
Tim S.
3
Ich habe meine eigene Antwort gefunden, alles stimmte, meiner Ansicht nach hatte ich einen Tippfehler auf einem völlig unabhängigen Objekt, ich hatte einen ViewBag.TypoObject <- dies führte dazu, dass alles durcheinander kam
Generalcoder

Antworten:

107

Gefundene Lösung: Ich hatte Tippfehler in meiner Ansicht, ViewBag.Typo <- dies verursachte den Fehler, aber der Debugger platzierte die Ausnahme an einer irrelevanten Stelle.

Generalcoder
quelle
11
Hatte gerade das gleiche Problem, bei dem der Debugger die Ausnahme an der falschen Stelle in der Ansicht platzierte. Ich hatte weiter unten eine Nullreferenz.
user1616625
5
Sehr nerviges Merkmal. Ich meine wirklich, Debugger, wenn Sie nicht wissen, was oder wo das Problem liegt, macht es die Dinge tatsächlich schwieriger, wenn Sie so tun, als ob Sie es tun.
Glenatron
2
Arggggg! Habe gerade eine Stunde damit verbracht! Hatte eine Teilansicht, die an einigen verschiedenen Stellen verwendet wurde ... Das Modell wurde genau so generiert, war jedoch fehlerhaft, wenn von einem Aktionsergebnis und nicht vom anderen verwiesen wurde. Es war auch ein ViewBag-Problem. Es wurde in einer Aktion und nicht in der anderen eingestellt. FRUSTRIEREND!!!
Ajzeffer
Das hat mir auch Zeit gespart. Hatte ein ähnliches Problem, als ich auf eine ViewBag-Eigenschaft zugegriffen habe, die nicht mehr vorhanden war, aber der Fehler "Laufzeitbindung für eine Nullreferenz kann nicht durchgeführt werden" ließ es so aussehen, als ob es sich um einen nicht verwandten Teil des Codes handelte.
Chris Morgan
8
Warten Sie - was war der Tippfehler?
Cullub
16

Dieser Fehler tritt auf, wenn in Ihrem Rasiermessercode ein ViewBag nicht vorhanden ist , der eine Methode aufruft.

Regler

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

Rasierer:

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

Aus irgendeinem Grund kann das .net den Fehler nicht in der richtigen Zeile anzeigen.

Normalerweise verursacht dies viel Zeitverschwendung.

AFetter
quelle
13

Diese Ausnahme wird auch ausgelöst, wenn eine nicht vorhandene Eigenschaft mithilfe von Reflection dynamisch aktualisiert wird.

Wenn Sie Reflection verwenden, um Eigenschaftswerte dynamisch zu aktualisieren, sollten Sie überprüfen, ob die übergebene PropertyNameEigenschaft mit der tatsächlichen Eigenschaft identisch ist.

In meinem Fall habe ich versucht, ein Update durchzuführen Employee.firstName, aber die Eigenschaft war tatsächlich Employee.FirstName.

Es lohnt sich, daran zu denken. :) :)

XtraSimplicity
quelle
5

Meine Lösung für diesen Fehler war das Kopieren und Einfügen aus einem anderen Projekt, auf das verwiesen wurde @Model.Id. Diese besondere Seite nicht hat ein Modell , aber die Fehlerzeile aus mir von den tatsächlichen Fehlern so weit war es nie gefunden!

Eonasdan
quelle
1

Sie müssen Zustände definieren, die nicht gleich null sind.

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

einstellen

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

Als Eigenschaft außerhalb der Funktion und innerhalb der Funktion sollten die Einträge eingefügt werden.

Alexandre
quelle
1
UH, was? Eigenschaften des Controllers sind nicht aus der Ansicht zugänglich, deshalb gibt es eine ViewBag und / oder ViewModel ...
Thomas Levesque
2
Es ist absolut nichts Falsches daran, einen Sammlungsinitialisierer zu verwenden. Dies wird das Problem NICHT lösen.
David L