Blazor select 绑定到列表中的值
Blazor select bind to a value in a list
我能够将 int 类型(这是列表 SelectedDiagnosisIdList 的第一个元素)变量绑定到 html select 的 selected 元素:
<div>
<label>Diagnosis:</label>
<div>
<select @bind="@userInfo.SelectedDiagnosisIdList[0]">
@foreach (var item in diagnoses)
{
<option value="@item.Id">@item.Name</option>
}
</select>
<p>@userInfo.SelectedDiagnosisIdList[0]"</p>
</div>
</div>
@code
{
List<int> SelectedDiagnosisIdList = new List<int>() { 0 };
List<Diagnosis> diagnoses; // populated from db in OnInitializedAsync
}
效果很好,当我更改 UI 上的 selected 值时,段落的值会发生变化。
现在,我想添加更多的诊断,所以我试图维护更多的 s 并向 SelectedDiagnosisIdList 添加更多的元素:
<div>
<label>Diagnosis:</label>
<div>
@for(int i = 0; i < userInfo.SelectedDiagnosisIdList.Count; i++)
<select @bind="@userInfo.SelectedDiagnosisIdList[i]">
@foreach (var item in diagnoses)
{
<option value="@item.Id">@item.Name</option>
}
</select>
<p>@userInfo.SelectedDiagnosisIdList[i]</p>
}
</div>
</div>
@code
{
List<int> SelectedDiagnosisIdList = new List<int>() { 0 };
List<Diagnosis> diagnoses; // populated from db in OnInitializedAsync
}
这会破坏程序,当我 select 一个项目时 UI 和控制台上没有任何反应:
blazor.webassembly.js:1 WASM: Unhandled exception rendering component:
blazor.webassembly.js:1 WASM: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
WASM: Parameter name: index
blazor.webassembly.js:1 WASM: at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
blazor.webassembly.js:1 WASM: at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) <0x20c1360 + 0x000ce> in <71c4fd446b1842ba93fd332e5f4f9c06>:0
blazor.webassembly.js:1 WASM: --- End of stack trace from previous location where exception was thrown ---
blazor.webassembly.js:1 WASM: at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion (System.Threading.Tasks.Task task) <0x269de40 + 0x000e6> in <cbf249d7f04d4fa18d15bfae8ef7f389>:0
WASM: at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask (System.Threading.Tasks.Task taskToHandle) <0x269e988 + 0x000c2> in <cbf249d7f04d4fa18d15bfae8ef7f389>:0
我不明白问题出在哪里,我该如何解决...请帮忙
我猜你的问题与 for 循环有关。您应该在循环中定义一个局部变量,如下所示:
<div>
@for(int i = 0; i < userInfo.SelectedDiagnosisIdList.Count; i++)
{
int local = i;
<select id=$"dropdown{local+1}"
@bind="@userInfo.SelectedDiagnosisIdList[local]">
@foreach (var item in diagnoses)
{
<option value="@item.Id">@item.Name</option>
}
</select>
<p>@userInfo.SelectedDiagnosisIdList[local]</p>
}
</div>
希望这对您有所帮助...
我能够将 int 类型(这是列表 SelectedDiagnosisIdList 的第一个元素)变量绑定到 html select 的 selected 元素:
<div>
<label>Diagnosis:</label>
<div>
<select @bind="@userInfo.SelectedDiagnosisIdList[0]">
@foreach (var item in diagnoses)
{
<option value="@item.Id">@item.Name</option>
}
</select>
<p>@userInfo.SelectedDiagnosisIdList[0]"</p>
</div>
</div>
@code
{
List<int> SelectedDiagnosisIdList = new List<int>() { 0 };
List<Diagnosis> diagnoses; // populated from db in OnInitializedAsync
}
效果很好,当我更改 UI 上的 selected 值时,段落的值会发生变化。
现在,我想添加更多的诊断,所以我试图维护更多的 s 并向 SelectedDiagnosisIdList 添加更多的元素:
<div>
<label>Diagnosis:</label>
<div>
@for(int i = 0; i < userInfo.SelectedDiagnosisIdList.Count; i++)
<select @bind="@userInfo.SelectedDiagnosisIdList[i]">
@foreach (var item in diagnoses)
{
<option value="@item.Id">@item.Name</option>
}
</select>
<p>@userInfo.SelectedDiagnosisIdList[i]</p>
}
</div>
</div>
@code
{
List<int> SelectedDiagnosisIdList = new List<int>() { 0 };
List<Diagnosis> diagnoses; // populated from db in OnInitializedAsync
}
这会破坏程序,当我 select 一个项目时 UI 和控制台上没有任何反应:
blazor.webassembly.js:1 WASM: Unhandled exception rendering component:
blazor.webassembly.js:1 WASM: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
WASM: Parameter name: index
blazor.webassembly.js:1 WASM: at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
blazor.webassembly.js:1 WASM: at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) <0x20c1360 + 0x000ce> in <71c4fd446b1842ba93fd332e5f4f9c06>:0
blazor.webassembly.js:1 WASM: --- End of stack trace from previous location where exception was thrown ---
blazor.webassembly.js:1 WASM: at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion (System.Threading.Tasks.Task task) <0x269de40 + 0x000e6> in <cbf249d7f04d4fa18d15bfae8ef7f389>:0
WASM: at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask (System.Threading.Tasks.Task taskToHandle) <0x269e988 + 0x000c2> in <cbf249d7f04d4fa18d15bfae8ef7f389>:0
我不明白问题出在哪里,我该如何解决...请帮忙
我猜你的问题与 for 循环有关。您应该在循环中定义一个局部变量,如下所示:
<div>
@for(int i = 0; i < userInfo.SelectedDiagnosisIdList.Count; i++)
{
int local = i;
<select id=$"dropdown{local+1}"
@bind="@userInfo.SelectedDiagnosisIdList[local]">
@foreach (var item in diagnoses)
{
<option value="@item.Id">@item.Name</option>
}
</select>
<p>@userInfo.SelectedDiagnosisIdList[local]</p>
}
</div>
希望这对您有所帮助...