【发布时间】:2019-12-05 15:34:42
【问题描述】:
假设我想使用EditForm,但我希望每次用户键入控件时触发值绑定,而不是仅仅在模糊时触发。
假设,为了一个例子,我想要一个 InputNumber<int> 来做这个?我试过使用不同的方法,比如bind-Value:event="oninput",但没有成功。通过复制 InputNumber 的 AspNetCore 源代码并覆盖/重写一些内容,我终于能够或多或少地获得我想要的东西。
这是我的InputNumber<int>,它实现了我的期望:
public class MyInputNumber: InputNumber<int>
{
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.OpenElement(0, "input");
builder.AddAttribute(1, "step", "any");
builder.AddMultipleAttributes(2, AdditionalAttributes);
builder.AddAttribute(3, "type", "number");
builder.AddAttribute(4, "class", CssClass);
builder.AddAttribute(5, "value", FormatValue(CurrentValueAsString));
builder.AddAttribute(6, "oninput", EventCallback.Factory.CreateBinder<string>(this, __value => CurrentValueAsString = __value, CurrentValueAsString));
builder.CloseElement();
}
// Copied from AspNetCore - src/Components/Components/src/BindConverter.cs
private static string FormatValue(string value, CultureInfo culture = null) => FormatStringValueCore(value, culture);
// Copied from AspNetCore - src/Components/Components/src/BindConverter.cs
private static string FormatStringValueCore(string value, CultureInfo culture)
{
return value;
}
}
请注意,序列 6 项中的“oninput”已从基本 InputNumber 的 BuildRenderTree 方法中的“onchange”更改。我想知道如何:
- 查看
BuildRenderTree的输出,以便我知道如何使用 Razor 和/或 - 只是大致了解哪种 Razor 语法相当于将来执行此操作。
我从 AspNetCore 代码中的 cmets 收集到,这绝对不是做这类事情的首选方法,Razor 是首选方法。我已经通过订阅 EditContext 的 OnFieldChangedEvent 测试了这在 .NET Core 3 Preview 7 ASP.NET Core Hosted Blazor 中是否有效,并且可以看到通过这种方法我得到了我正在寻找的不同行为为了。希望有更好的方法。
更新
包括有关问题的更多信息
@using BlazorAugust2019.Client.Components;
@inherits BlazorFormsCode
@page "/blazorforms"
<EditForm EditContext="EditContext">
<div class="form-group row">
<label for="date" class="col-sm-2 col-form-label text-sm-right">Date: </label>
<div class="col-sm-4">
<KlaInputDate Id="date" Class="form-control" @bind-Value="Model.Date"></KlaInputDate>
</div>
</div>
<div class="form-group row">
<label for="summary" class="col-sm-2 col-form-label text-sm-right">Summary: </label>
<div class="col-sm-4">
<KlaInputText Id="summary" Class="form-control" @bind-Value="Model.Summary"></KlaInputText>
</div>
</div>
<div class="form-group row">
<label for="temperaturec" class="col-sm-2 col-form-label text-sm-right">Temperature °C</label>
<div class="col-sm-4">
<KlaInputNumber Id="temperaturec" Class="form-control" @bind-Value="Model.TemperatureC"></KlaInputNumber>
</div>
</div>
<div class="form-group row">
<label for="temperaturef" class="col-sm-2 col-form-label text-sm-right">Temperature °F</label>
<div class="col-sm-4">
<input type="text" id="temperaturef" class="form-control" value="@Model.TemperatureF" readonly />
</div>
</div>
</EditForm>
using BlazorAugust2019.Shared;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using System;
namespace BlazorAugust2019.Client.Pages.BlazorForms
{
public class BlazorFormsCode : ComponentBase
{
public EditContext EditContext;
public WeatherForecast Model;
public BlazorFormsCode()
{
Model = new WeatherForecast()
{
Date = DateTime.Now,
Summary = "Test",
TemperatureC = 21
};
EditContext = new EditContext(Model);
EditContext.OnFieldChanged += EditContext_OnFieldChanged;
}
private void EditContext_OnFieldChanged(object sender, FieldChangedEventArgs e)
{
Console.WriteLine($"EditContext_OnFieldChanged - {e.FieldIdentifier.FieldName}");
}
}
}
我正在寻找的是在我输入输入时触发的“EditContext_OnFieldChanged”事件。当前示例有效,只是在寻找更好的方法。
【问题讨论】:
-
当您说“当前示例有效”时,您的意思是在您输入输入时触发了“EditContext_OnFieldChanged”事件吗?我认为无法触发“EditContext_OnFieldChanged”事件,因为没有代码触发 InputBase
中定义的 ValueChanged 委托 -
我不确定它发生在哪里或为什么发生,但它正在发生。是的,Console.WriteLine 被击中,我可靠地获得了更改的字段的名称。我不知道,也许它在我正在扩展的派生类 InputNumber、InputText 等中。
标签: c# .net asp.net-core blazor