web-dev-qa-db-fra.com

Impossible d'effectuer une liaison d'exécution sur une référence null, mais ce n'est pas une référence null

en utilisant: MVC 4, ASP.NET Razor

Je reçois une erreur qui semble ne pas être possible. Il me dit que j'utilise une référence nulle, States, mais il est clairement défini.

Manette:

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

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

L'erreur:

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

Solution trouvée: à mon avis, j'avais une faute de frappe, ViewBag.Typo <- cela était à l'origine de l'erreur, mais le débogueur a placé l'exception à un endroit non pertinent.

90
generalcoder

Cette exception est également levée lorsqu'une propriété inexistante est mise à jour de manière dynamique, à l'aide de la réflexion.

Si l'on utilise la réflexion pour mettre à jour de manière dynamique les valeurs de propriété, il convient de vérifier que le PropertyName transmis est identique à la propriété réelle.

Dans mon cas, j'essayais de mettre à jour Employee.firstName, mais la propriété était en fait Employee.FirstName.

Cela vaut la peine de garder à l'esprit. :)

12
XtraSimplicity

Cette erreur se produit lorsque vous avez un ViewBag non existant dans votre code de rasoir appelant une méthode.

contrôleur

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

rasoir:

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

Pour une raison quelconque, le .net ne peut pas afficher l'erreur dans la ligne correcte. Normalement, cela cause beaucoup de temps perdu.

12
AFetter

Ma solution à cette erreur a consisté à copier et coller d'un autre projet faisant référence à @Model.Id. n'avait pas de modèle dans cette page, mais la ligne d'erreur était si éloignée de l'erreur réelle que je n'ai jamais trouvée!

5
Eonasdan

Vous devez définir des états différents de null.

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