Я изучаю Blazor и адаптирую Fluent UI, потому что они оба созданы Microsoft и думаю, что они будут работать хорошо.
Поэтому я меняю HTML-форму редактирования ниже на свободную форму редактирования. Я применяю его, просматривая описание формы на сайте Blazor Fluent UI, и когда я нажимаю кнопку «Войти», появляется сообщение: «EditForm требует либо параметра Model, либо параметра EditContext, укажите один из них. " Я получаю эту ошибку.
Это работает нормально.
<EditForm Model = "@loginModel" OnValidSubmit = "Authenticate" FormName = "LoginForm">
<DataAnnotationsValidator />
<div class = "mb-3 text-center flex-cloumn">
<h3>LOGIN</h3>
</div>
<div class = "mb-3">
<label for = "userName" class = "form-label">User Name:</label>
<InputText id = "userName" @bind-Value = "loginModel.UserName" class = "form-control" />
<ValidationMessage For = "() => loginModel.UserName" class = "text-danger" />
</div>
<div class = "mb-3">
<label for = "password" class = "form-label">Password:</label>
<InputText id = "password" @bind-Value = "loginModel.Password" class = "form-control" />
<ValidationMessage For = "() => loginModel.Password" class = "text-danger" />
</div>
<div class = "mb-3 text-center">
<span class = "text-danger">@errorMessage</span>
</div>
<button type = "submit" class = "btn btn-primary">Login</button>
</EditForm>
@code {
[SupplyParameterFromForm]
public LoginViewModel loginModel { get; set; } = new();
private string? errorMessage;
private async Task Authenticate()
{
Console.WriteLine("Authenticate called");
}
}
но это не так
<FluentEditForm Model = "@loginModel" OnValidSubmit = "Authenticate" FormName = "LoginForm" novalidate>
<DataAnnotationsValidator />
<FluentStack Orientation = "Orientation.Vertical">
<h3>LOGIN</h3>
<div>
<FluentTextField Name = "userName" @bind-Value = "loginModel.UserName" Label = "User Name" Required />
<FluentValidationMessage For = "@(() => loginModel.UserName)"/>
</div>
<div>
<FluentTextField Name = "password" @bind-Value = "loginModel.Password" TextFieldType = "TextFieldType.Password" Label = "Password" Required />
<FluentValidationMessage For = "@(() => loginModel.Password)"/>
</div>
<FluentButton Type = "ButtonType.Submit" Appearance = "Appearance.Accent">Login</FluentButton>
</FluentStack>
</FluentEditForm>
@code {
[SupplyParameterFromForm]
public LoginViewModel loginModel { get; set; } = new();
private string? errorMessage;
private async Task Authenticate()
{
Console.WriteLine("Authenticate called");
}
}
Я уже предоставляю параметр модели в теге FluentEditform, но получаю эту ошибку, поэтому это не имеет особого смысла.
InvalidOperationException: EditForm требуется либо параметр модели, либо параметр EditContext, укажите один из них.
Microsoft.AspNetCore.Components.Forms.EditForm.OnParametersSet()
Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
Microsoft.AspNetCore.Components.Rendering.ComponentState.SupplyCombinedParameters(ParameterView directAndCascadingParameters)
Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(ref DiffContext diffContext, int frameIndex)
Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(ref DiffContext diffContext, int newFrameIndex)
Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(ref DiffContext diffContext, int oldStartIndex, int oldEndIndexExcl, int newStartIndex, int newEndIndexExcl)
Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, out Exception renderFragmentException)
Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
Microsoft.AspNetCore.Components.ComponentBase.StateHasChanged()
Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
Microsoft.AspNetCore.Components.Rendering.ComponentState.SupplyCombinedParameters(ParameterView directAndCascadingParameters)
Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView parameters)
Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderRootComponentAsync(int componentId, ParameterView initialParameters)
Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.BeginRenderingComponent(IComponent component, ParameterView initialParameters)
Microsoft.AspNetCore.Components.Endpoints.EndpointHtmlRenderer.RenderEndpointComponent(HttpContext httpContext, Type rootComponentType, ParameterView parameters, bool waitForQuiescence)
System.Threading.Tasks.ValueTask<TResult>.get_Result()
Microsoft.AspNetCore.Components.Endpoints.RazorComponentEndpointInvoker.RenderComponentCore(HttpContext context)
Microsoft.AspNetCore.Components.Endpoints.RazorComponentEndpointInvoker.RenderComponentCore(HttpContext context)
Microsoft.AspNetCore.Components.Rendering.RendererSynchronizationContext+<>c+<<InvokeAsync>b__10_0>d.MoveNext()
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Antiforgery.Internal.AntiforgeryMiddleware.InvokeAwaited(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
Большинство ответов, которые я нашел, предназначены просто для того, чтобы убедиться, что вы предоставили модель или инициализировали предоставленную вами модель, что, на мой взгляд, является довольно простой задачей и не чем иным, как модификацией учебника, но я не знаю. почему.
Я попробовал подписаться на этот пост , но хочу использовать httpcontext на статических страницах, поэтому надеялся, что есть другой обходной путь.
Я использую ssr, когда я устанавливаю интерактивный сервер, он работает. но если я это установлю, я не смогу использовать httpcontext.
Есть небольшая разница при использовании FluentTextField в SSR. Вам необходимо установить свойство «Имя» модели, например Name = "loginModel.UserName"
.
...
<FluentTextField Name = "loginModel.UserName" @bind-Value = "loginModel.UserName" Label = "User Name" Required />
...
<FluentTextField Name = "loginModel.Password" @bind-Value = "loginModel.Password" TextFieldType = "TextFieldType.Password" Label = "Password" Required />
...
Тогда форма редактирования будет работать.
Это работает! большое спасибо!
Какой RenderMode вы используете и где настроена интерактивность?