[英]Blazor binding to array is one element off?
編輯:我正在使用 Blazor .net
我正在嘗試將<select>
的選定值綁定到 int[] 的元素。 由於某種原因,它綁定到 Role[k+1] 而不是 Role[k] 我已經將 k 的值放在 select 元素旁邊,以確保它是正確的,並實現了一個按鈕,當點擊時輸出 Role 中的每個項目[]。 由於它正在執行 Role[k+1] 我嘗試執行 Role[k-1] 並得到錯誤:“索引超出了數組的范圍”,正如預期的那樣。
我確定我做錯了什么,但我一生都無法弄清楚是什么。 另請注意,如果我綁定到 Role[0](第一次迭代時 Role[k] 應該等價於),則值設置為正確的數組元素。
這是代碼的相關部分:
@{
int k = 0;
for (int i = 1; i < NumberOfPlayers + 1; i++)
{
int j = 0; Console.WriteLine(k);
<p mb-3>
Player @i - Role:
<select @bind="Role[k]">
@foreach (string roleText in RolesText)
{
<option value="@j">@roleText - @j</option>
j++;
}
</select> @k
</p>
k++;
}
}
這是完整的代碼:
<h1>Player 1 : @Role[0]</h1>
<h1>Player 2 : @Role[1]</h1>
<h1>Player 3 : @Role[2]</h1>
<h1>Player 4 : @Role[3]</h1>
<h1>Player 5 : @Role[4]</h1>
<h1>Player 6 : @Role[5]</h1>
<div class="card">
<div class="card-header bg-dark text-white">
<h5 class="font-weight-bold">Random Heroes</h5>
</div>
<div class="card-body">
<select @bind="NumberOfPlayers" class="custom-select cm-lg-4">
@for (int i = 1; i <= 6; i++)
{
@if (i == 1)
{
<option value="@i" selected>@i Player</option>
}
else
{
<option value="@i">@i Players</option>
}
}
</select>
<select @bind="NumberOfRounds" class="custom-select cm-lg-4 my-3">
@for (int i = 1; i <= 6; i++)
{
@if (i == 1)
{
<option value="@i" selected>@i Round</option>
}
else
{
<option value="@i">@i Rounds</option>
}
}
</select>
@{
int k = 0;
for (int i = 1; i < NumberOfPlayers + 1; i++)
{
int j = 0; Console.WriteLine(k);
<p mb-3>
Player @i - Role:
<select @bind="Role[k]">
@foreach (string roleText in RolesText)
{
<option value="@j">@roleText - @j</option>
j++;
}
</select> @k
</p>
k++;
}
}
<p m-4>
@NumberOfPlayers players are playing @NumberOfRounds rounds
</p>
<button @onclick="GenerateHeroesClick">Generate Comp</button>
</div>
</div>
@code {
public int NumberOfPlayers { get; set; }
public int NumberOfRounds { get; set; }
public int[] Role = new int[6];
public List<string> RolesText;
protected override void OnInitialized()
{
NumberOfPlayers = 1;
NumberOfRounds = 1;
string[] CharacterRolesText = Enum.GetNames(typeof(CharacterRole));
RolesText = new List<string>(CharacterRolesText);
for(int l=0; l<Role.Length; l++)
{
Role[l] = 0;
}
}
private void GenerateHeroesClick()
{
for(int i = 0; i<6; i++)
{
Console.WriteLine("Role Index" + i + " = " + Role[i]);
}
}
}
@bind="Role[k]"
使用的是 k 的當前值,而不是創建元素時的 k 值。 我通過在播放器循環的每次迭代中聲明 int test = k 來解決它。 這是工作片段。
@{
int k = 0;
for (int i = 1; i < 7; i++)//NumberOfPlayers + 1; i++)
{
int j = 0; Console.WriteLine(k);
int test = k;
<p mb-3>
Player @i - Role:
<select @bind="Role[test]">
@foreach (string roleText in RolesText)
{
<option value="@j">@roleText - @j</option>
j++;
}
</select> @k
</p>
k++;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.