No se puede realizar el enlace en tiempo de ejecución en una referencia nula, pero NO es una referencia nula

80

usando: MVC 4, ASP.NET Razor

Recibo un error que parece que no debería ser posible. Me dice que estoy usando una referencia nula, States, pero claramente se está configurando.

Controlador:

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

La vista:

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

El error:

Cannot perform runtime binding on a null reference
Line 54: @foreach (KeyValuePair<int, string> de in ViewBag.States)
codificador general
fuente
3
¿Estás seguro de que está pasando correctamente por tu método primero?
Jon Skeet
1
Coloque puntos de interrupción en su Index()método y la vista, y vea si eso le ayuda a ver qué está mal.
Tim S.
3
Encontré mi propia respuesta, todo estaba bien, dentro de mi vista tuve un error tipográfico en un objeto completamente no relacionado, tenía un ViewBag.TypoObject <- esto causó que todo se estropeara
generalcoder

Respuestas:

108

Solución encontrada: tenía un error tipográfico en mi opinión, ViewBag.Typo <- esto causó el error, pero el depurador colocó la excepción en un lugar irrelevante.

codificador general
fuente
11
Acabo de tener el mismo problema en el que el depurador colocaba la excepción en el punto incorrecto de la vista. Tenía una referencia nula más abajo.
user1616625
5
Rasgo muy molesto. En realidad, depurador, si no sabes cuál es el problema o dónde está, en realidad hace las cosas más difíciles cuando finges que lo sabes.
glenatron
2
¡Arggggg! ¡Acabo de dedicar una hora a esto! Tenía una vista parcial que se estaba usando en algunos lugares de diferencia ... El modelo se generó EXACTO igual pero estaba fallando cuando se hacía referencia a un resultado de acción y no al otro. También terminó siendo un problema de ViewBag. Se estaba preparando en una acción y no en la otra. ¡¡¡FRUSTRANTE!!!
ajzeffer
Esto también me ahorró algo de tiempo. Tuve un problema similar en el que estaba accediendo a una propiedad de ViewBag que ya no existía, pero el error 'No se puede realizar el enlace en tiempo de ejecución en una referencia nula' hizo que pareciera que estaba sucediendo en una parte no relacionada del código.
Chris Morgan
8
espera, ¿cuál fue el error tipográfico?
Cullub
16

Este error ocurre cuando se tiene un ViewBag inexistente en su código de afeitar llamando a un método.

Controlador

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

maquinilla de afeitar:

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

Por alguna razón, .net no puede mostrar el error en la línea correcta.

Normalmente, esto provoca una gran pérdida de tiempo.

Después
fuente
13

Esta excepción también se produce cuando una propiedad inexistente se actualiza dinámicamente mediante la reflexión.

Si uno está usando la reflexión para actualizar dinámicamente los valores de las propiedades, vale la pena verificar para asegurarse de que el PropertyName que la propiedad sea ​​idéntica a la real.

En mi caso, estaba intentando actualizar Employee.firstName, pero la propiedad realmente era Employee.FirstName.

Vale la pena tenerlo en cuenta. :)

XtraSimplicity
fuente
5

Mi solución a este error fue copiar y pegar de otro proyecto que tenía una referencia a @Model.Id. Esta página en particular no tenía un modelo, pero la línea de error estaba tan lejos del error real que casi nunca la encontré.

Eonasdan
fuente
1

Debe definir estados que no sean iguales a nulo.

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

Conjunto

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

como una propiedad fuera de la función y dentro de la función inserte las entradas, debería funcionar.

Alexandre
fuente
1
¿Cómo? Las propiedades del controlador no son accesibles desde la vista, por eso hay un ViewBag y / o ViewModel ...
Thomas Levesque
2
No hay absolutamente nada de malo en usar un inicializador de colección. Esto NO solucionará el problema.
David L