【发布时间】:2021-04-20 00:42:55
【问题描述】:
我正在尝试创建一个 Input 组件,它可以:
-
按 Escape 时清除其值。
-
在鼠标滚轮上更改其值。 我正在创建一个 Input 组件,因为我不想在所有 Inputs 元素中放入相同的代码,我需要从同一个站点管理所有元素。我有 6 天的 dis 问题。我正在阅读和搜索我可以使用但没有 100% 帮助我的信息。
@inherits Microsoft.AspNetCore.Components.Forms.InputBase<string> @using Microsoft.AspNetCore.Components.Forms @if (ReadOnly) { <InputText type="text" tabindex="@TabIndex" class="@Class" id="@Id" style="@Style" maxlength="@MaxLength" min="@Min" max="@Max" placeholder="@Placeholder" readonly /> } else { <InputText type="text" maxlength="@MaxLength" min="@Min" max="@Max" class="@Class" tabindex="@TabIndex" id="@Id" style="@Style" placeholder="@Placeholder" @attributes="@AdditionalAttributes" @bind-Value="@Value" @bind-Value:event="oninput" @onkeydown="@(e => { if (e.Code == "Escape") Value = Clear(); StateHasChanged(); })" @onmousewheel="CaptureScroll" /> } @code{ [Parameter] public string Type { get; set; } [Parameter] public string Class { get; set; } [Parameter] public string Placeholder { get; set; } [Parameter] public string Id { get; set; } [Parameter] public string Style { get; set; } [Parameter] public bool ReadOnly { get; set; } [Parameter] public int MaxLength { get; set; } [Parameter] public int Min { get; set; } [Parameter] public int Max { get; set; } [Parameter] public int TabIndex { get; set; } }
当我需要使用它时,我只需调用它:
<HyperInput Type="text" Class="form-control" Id="inputName" TabIndex="1" @bind-Value="model.ModelName" />.
当我运行应用程序试图使其工作时,我遇到了这个错误:
错误:System.InvalidOperationException:Shared_Components.Forms.HyperInput 需要 EditContext 类型的级联参数。例如,您可以在 EditForm 中使用 Shared_Components.Forms.HyperInput。 在 Microsoft.AspNetCore.Components.Forms.InputBase
1.SetParametersAsync(ParameterView parameters) at Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView parameters) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext& diffContext, Int32 frameIndex) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext& diffContext, Int32 frameIndex) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& diffContext, Int32 newFrameIndex) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext& diffContext, Int32 oldStartIndex, Int32 oldEndIndexExcl, Int32 newStartIndex, Int32 newEndIndexExcl) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer renderer, RenderBatchBuilder batchBuilder, Int32 componentId, ArrayRange1 oldTree, ArrayRange`1 newTree) 在 Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder,RenderFragment renderFragment) 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(RenderQueueEntry renderQueueEntry) 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
我尝试使用 EditForm 包装 HyperInput 并且不起作用。
希望有人可以帮助我,我需要它。
编辑:
现在,我正在尝试使用 input 元素而不是 InputText 并且不继承 InputBase。我只加了:
private string _binder;
[Parameter]
public string Binder
{
get => _binder;
set => Set(value);
}
[ParameterAttribute] public EventCallback<string> BinderChanged { get; set; }
public async void Set(string value)
{
_binder = value;
await BinderChanged.InvokeAsync(value);
}
我对这个组件唯一能做的就是用退格键删除。
注意:我使用的是@bind-Binder,而不是使用@bind-Value。
【问题讨论】:
-
InputText设计用于带有模型的EditForm- 您出于某种原因需要 InputText 吗?你能用标准的input吗? -
是的,我可以使用标准的
input。