Reputation: 263
I am trying to output a player's stats in a table. Not all players will have stats depending on the day. I have tried other ways and all are still complaining. Here is the code I have now:
<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>
Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot perform runtime binding on a null reference
Source Error:
Line 32: }
Line 33: else{
Line 34: @ViewBag.Stats[index].Points
Line 35: @ViewBag.Stats[index].Rebounds
Line 36: @ViewBag.Stats[index].Assists
Upvotes: 6
Views: 49891
Reputation: 21
I tried both cases suggested above, but with no luck. Then finally I had to initialize my ViewBag collection in the Controller's Index method itself. So when I did something like this,
var stringArray = new string[10] { "", "", "", "", "", "", "", "", "", "" };
ViewBag.doc = stringArray;
it worked. (I had 10 elements. If they were more, had to do something else for initialization.) My code on the view part is as follows now:
@for (var itm =0; itm< 10; itm++)
{
<div class="form-group">
<label asp-for="Documents[itm].doc"></label>
<input type="file" asp-for="Documents[itm].doc" />
@if (ViewBag.doc[itm] != "")
{<a asp-area="" asp-page="/wwwroot/CaseDocuments/@ViewBag.doc[itm]">@ViewBag.doc[itm]</a>
<label asp-for="Documents[itm].remove"></label>
@Html.CheckBoxFor(a => a.Documents[itm].remove)
}
</div>
<div class="form-group">
<label asp-for="Documents[itm].desc"></label>
<textarea asp-for="Documents[itm].desc" class="form-control" rows="3"></textarea>
</div>
}
Upvotes: 0
Reputation: 17094
if you want to keep track of the index, why dont you rewrite your loop as:
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 */
}
Upvotes: 0
Reputation: 6430
OK I am posting the full answer here -
Try @
before if(@ViewBag.Stats[index] == null){
and remove @
from @ViewBag
inside the if
so that it look like this - @if(ViewBag.Stats[index] == null){
You are setting index = 0
, inside foreach
, so it is initialised in every loop. Initialise it outside foreach
like this
var index = 0;
foreach ...
if you are facing problem for the scope try this -
@{
var index = 0;
foreach (....) {
.......
index++
}
}
Upvotes: 9