Я новичок в Blazor и пытаюсь создать с его помощью очень простую форму. Метод OnInitialized
работает нормально, то есть после отображения на странице значения «Hello World!» отображается в текстовом поле.
Однако, если я изменю значение и отправлю форму, значение обновит поле userInput
. Кто-нибудь знает причину этого и как это исправить?
Ваше здоровье!
@page "/simpleform"
<PageTitle>TestPage</PageTitle>
<h3>Einfaches Formular</h3>
<EditForm Model = "userInput" OnValidSubmit = "HandleSubmit" FormName = "test">
<DataAnnotationsValidator />
<ValidationSummary />
<div class = "form-group">
<label for = "inputText">Text eingeben</label>
<InputText id = "inputText" class = "form-control" @bind-Value = "userInput.InputText" />
</div>
<button type = "submit" class = "btn btn-primary">Absenden</button>
</EditForm>
@if (submittedText != null)
{
<p>Du hast eingegeben: @submittedText</p>
}
@code {
private UserInputModel userInput = new UserInputModel();
private string? submittedText;
protected override void OnInitialized()
{
userInput.InputText = "Hello World!";
}
private void HandleSubmit()
{
submittedText = userInput.InputText;
}
public class UserInputModel
{
public string? InputText { get; set; }
}
}
using Test.Components;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.Run();
@nicesbrot ваш проект — веб-сборка Blazor или сервер Blazor?
Каков тип режима рендеринга вашего приложения Blazor? Это SSR или InteractiveServer?
Спасибо за ответы, ребята. Я добавил код из своего Program.cs. Я использую серверное приложение Blazor с режимом рендеринга InteractiveServer.
@YongShun Я согласен, в BlazorFiddle все работает нормально.
Убедитесь, что вы применяете режим рендеринга ко всему приложению.
Это должно предотвратить повторный рендеринг компонента и привести к тому, что значение userInput.InputText
будет сброшено на «Hello World!».
Приложение.razor
<HeadOutlet @rendermode = "InteractiveServer" />
<Routes @rendermode = "InteractiveServer" />
Это исправило ситуацию. Спасибо! :) Почему это не установлено по умолчанию?
Пожалуйста. Что касается вашего вопроса, возможно, я не прав, исходя из того, что я знаю, что режим рендеринга включается (необязательно) через конвейер в Program.cs (AddInteractiveServerRenderMode()
). А режим рендеринга можно было применить только к определенным компонентам @rendermode
. Таким образом, Blazor может быть сложно установить его по умолчанию. Возможно, эту функцию можно предложить на GitHub и посмотреть, каковы отзывы и опасения разработчиков.
«Почему это не установлено по умолчанию?» Он устанавливается на основе того, какой шаблон и параметры шаблона вы выбираете при создании решения. Вы выбрали «На страницу/компонент», вот что вы получили. Это довольно распространенная ошибка, которую совершают при первом использовании Blazor.
Хммм, из этой демо я вижу, что оба
userInput
иsubmittedText
обновлены.