带有 select 下拉列表的 Blazor onchange 事件
Blazor onchange event with select dropdown
注意:这个问题是关于 Blazor (0.2.1) 的预发布版的。
所以我一直试图让一个简单的 onchange 在 select 下拉值更改时触发。像这样:
<select class="form-control d-flex" onchange="(dostuff())">
@foreach (var template in templatestate.templates)
{
<option value=@template.Name>@template.Name</option>
}
</select>
被调用的方法:
void dostuff()
{
Console.WriteLine("first spot is firing");
_template = templatestate.templates.FirstOrDefault(x => x.Name ==
_template.Name);
Console.WriteLine("second spot is firing");
}
无论我如何尝试重新定位,我得到的结果都是浏览器中的错误。
Uncaught Error: System.ArgumentException: There is no event handler with ID 0
我是否缺少明显和关键的东西?因为我有一个按钮 onclick
事件在同一页面上工作得很好。
对于初学者,您没有使用正确的绑定语法:
onchange="@dostuff"
注意@
您的答案应该在 cshtml 中:
<select @onchange="DoStuff"> //pre-3.0 versions: onchange=@DoStuff
@foreach (var template in templates)
{
<option value=@template>@template</option>
}
</select>
然后你的@functions(在 razor components @code instead. See: Razor Syntax: Functions)应该看起来像:
@functions { //use @code in razor components.
List<string> templates = new List<string>() { "Maui", "Hawaii", "Niihau", "Kauai", "Kahoolawe" };
string SelectedString = "Maui";
void DoStuff(ChangeEventArgs e)
{
SelectedString = e.Value.ToString();
Console.WriteLine("It is definitely: " + SelectedString);
}
}
您也可以只使用绑定...
<select @bind="SelectedString"> //pre 3.0 bind="@SelectedString"
但是@onchange="DoStuff" 允许您对选择执行逻辑。
这里有一些变化 link:Blazor WebAssembly 3.2.0 Preview 5 release now available
作为设置 onchange 事件的替代方法,您可以将下拉列表绑定到 属性 并处理 属性 集中的更改。通过这种方式,您可以在同一进程中获得所有被 selected 的值,而无需转换对象值。另外,如果您已经在 select 上使用了 @bind,您也无法在其上使用 onchange。
<select @bind="BoundID">
...
</select>
@code {
private int? _boundID = null;
private int? BoundID
{
get
{
return _boundID;
}
set
{
_boundID = value;
//run your process here to handle dropdown changes
}
}
}
以上答案对我不起作用,出现编译错误。
下面是我的工作代码。
@inject HttpClient httpClient
@if (States != null)
{
<select id="SearchStateId" name="stateId" @onchange="DoStuff" class="form-control1">
<option>@InitialText</option>
@foreach (var state in States)
{
<option value="@state.Name">@state.Name</option>
}
</select>
}
@code {
[Parameter] public string InitialText { get; set; } = "Select State";
private KeyValue[] States;
private string selectedString { get; set; }
protected override async Task OnInitializedAsync()
{
States = await httpClient.GetJsonAsync<KeyValue[]>("/sample-data/State.json");
}
private void DoStuff(ChangeEventArgs e)
{
selectedString = e.Value.ToString();
Console.WriteLine("It is definitely: " + selectedString);
}
public class KeyValue
{
public int Id { get; set; }
public string Name { get; set; }
}
}
只是想添加到其他答案中,您也可以使用 lambda 表达式访问 select
值:
<select @onchange="@(e => ViewModel.TargetProperty = e.Value.ToString())">
以防您希望将代码直接放在元素中。
您也可以试试:
<select @onchange="(e => DoStuff(e.Value.ToString()))">
注意:这个问题是关于 Blazor (0.2.1) 的预发布版的。
所以我一直试图让一个简单的 onchange 在 select 下拉值更改时触发。像这样:
<select class="form-control d-flex" onchange="(dostuff())">
@foreach (var template in templatestate.templates)
{
<option value=@template.Name>@template.Name</option>
}
</select>
被调用的方法:
void dostuff()
{
Console.WriteLine("first spot is firing");
_template = templatestate.templates.FirstOrDefault(x => x.Name ==
_template.Name);
Console.WriteLine("second spot is firing");
}
无论我如何尝试重新定位,我得到的结果都是浏览器中的错误。
Uncaught Error: System.ArgumentException: There is no event handler with ID 0
我是否缺少明显和关键的东西?因为我有一个按钮 onclick
事件在同一页面上工作得很好。
对于初学者,您没有使用正确的绑定语法:
onchange="@dostuff"
注意@
您的答案应该在 cshtml 中:
<select @onchange="DoStuff"> //pre-3.0 versions: onchange=@DoStuff
@foreach (var template in templates)
{
<option value=@template>@template</option>
}
</select>
然后你的@functions(在 razor components @code instead. See: Razor Syntax: Functions)应该看起来像:
@functions { //use @code in razor components.
List<string> templates = new List<string>() { "Maui", "Hawaii", "Niihau", "Kauai", "Kahoolawe" };
string SelectedString = "Maui";
void DoStuff(ChangeEventArgs e)
{
SelectedString = e.Value.ToString();
Console.WriteLine("It is definitely: " + SelectedString);
}
}
您也可以只使用绑定...
<select @bind="SelectedString"> //pre 3.0 bind="@SelectedString"
但是@onchange="DoStuff" 允许您对选择执行逻辑。
这里有一些变化 link:Blazor WebAssembly 3.2.0 Preview 5 release now available
作为设置 onchange 事件的替代方法,您可以将下拉列表绑定到 属性 并处理 属性 集中的更改。通过这种方式,您可以在同一进程中获得所有被 selected 的值,而无需转换对象值。另外,如果您已经在 select 上使用了 @bind,您也无法在其上使用 onchange。
<select @bind="BoundID">
...
</select>
@code {
private int? _boundID = null;
private int? BoundID
{
get
{
return _boundID;
}
set
{
_boundID = value;
//run your process here to handle dropdown changes
}
}
}
以上答案对我不起作用,出现编译错误。
下面是我的工作代码。
@inject HttpClient httpClient
@if (States != null)
{
<select id="SearchStateId" name="stateId" @onchange="DoStuff" class="form-control1">
<option>@InitialText</option>
@foreach (var state in States)
{
<option value="@state.Name">@state.Name</option>
}
</select>
}
@code {
[Parameter] public string InitialText { get; set; } = "Select State";
private KeyValue[] States;
private string selectedString { get; set; }
protected override async Task OnInitializedAsync()
{
States = await httpClient.GetJsonAsync<KeyValue[]>("/sample-data/State.json");
}
private void DoStuff(ChangeEventArgs e)
{
selectedString = e.Value.ToString();
Console.WriteLine("It is definitely: " + selectedString);
}
public class KeyValue
{
public int Id { get; set; }
public string Name { get; set; }
}
}
只是想添加到其他答案中,您也可以使用 lambda 表达式访问 select
值:
<select @onchange="@(e => ViewModel.TargetProperty = e.Value.ToString())">
以防您希望将代码直接放在元素中。
您也可以试试:
<select @onchange="(e => DoStuff(e.Value.ToString()))">