web-dev-qa-db-fra.com

ASP.NET MVC 4 - Impossible d'établir une liaison d'exécution sur une référence null

J'essaie de sortir les statistiques d'un joueur dans un tableau. Tous les joueurs n'auront pas de statistiques en fonction du jour. J'ai essayé d'autres moyens et tous se plaignent encore. Voici le code que j'ai maintenant:

      <tbody>
            @foreach(var player in @ViewBag.Roster){
                int index = 0;
                <tr>
                    <td>@player.Name, @player.TeamName @player.Position</td>
                    if(@ViewBag.Stats[index] == null){
                        <td>--</td>
                        <td>--</td>
                        <td>--</td>
                        <td>--</td>
                    }
                    else{
                        <td>@ViewBag.Stats[index].Points</td>
                        <td>@ViewBag.Stats[index].Rebounds</td>
                        <td>@ViewBag.Stats[index].Assists</td>
                        <td>@ViewBag.Stats[index].Turnovers</td>                        
                    }
                </tr>
                index++;
            }

        </tbody>

Détails des exceptions: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: impossible d'exécuter une liaison d'exécution sur une référence null

Erreur de source: 

Ligne 32:}

Ligne 33: else {

Ligne 34: @ ViewBag.Stats [index] .Points

Ligne 35: @ ViewBag.Stats [index] .Rebounds

Ligne 36: @ ViewBag.Stats [index] .Assists

6
user3562751

OK je poste la réponse complète ici - 

  1. Essayez @ avant if(@ViewBag.Stats[index] == null){ et supprimez @ de @ViewBag dans la if de façon à ce qu'il ressemble à ceci - @if(ViewBag.Stats[index] == null){ 

  2. Vous définissez index = 0, dans foreach, il est donc initialisé à chaque boucle. Initialisez-le en dehors de foreach comme ceci

    var index = 0; foreach ...

si vous faites face à un problème de portée, essayez ceci - 

@{
    var index = 0;
    foreach (....) {
        .......
        index++
    }
}
9
brainless coder

si vous voulez garder une trace de l'index, pourquoi ne pas réécrire votre boucle en tant que:

    var obj = new string[] { "", "", "" };

    for(var index = 0; index < obj.Length; index++)
    {
        var item = obj[index];

        /* DO STUFF WITH ITEM */
    }

    foreach(var item in obj.Select((value, index) => new { index, value }))
    {
        /* DO STUFF WITH item.Value */
    }
0
Dementic