почему поля в loginModel остаются пустыми при нажатий на кнопку?

@using System.Text.Json.Serialization
@page "/login"
@inject HttpClient Http
@inject NavigationManager Navigation

<EditForm Model="@loginModel" OnValidSubmit="@HandleLogin" FormName="loginForm">
    <DataAnnotationsValidator />
    <ValidationSummary />
    <div>
        <label>Email:</label>
        <InputText @bind-Value="loginModel.Email" />
    </div>
    <div>
        <label>Пароль:</label>
        <InputText @bind-Value="loginModel.Password" type="password" />
    </div>
    <button type="submit">Войти</button>
</EditForm>

@if (!string.IsNullOrEmpty(errorMessage))
{
    <div class="alert alert-danger">@errorMessage</div>
}

@code {
    private LoginModel loginModel = new LoginModel();
    private string errorMessage;

    private async Task HandleLogin()
    {
        errorMessage = string.Empty;
        try
        {
            var response = await Http.PostAsJsonAsync("api/Auth/login", loginModel);
            if (response.IsSuccessStatusCode)
            {
                var tokenResponse = await response.Content.ReadFromJsonAsync<TokenResponse>();
           
                Navigation.NavigateTo("/");
            }
            else
            {
                errorMessage = "Ошибка входа. Проверьте правильность данных.";
            }
        }
        catch (Exception ex)
        {
            errorMessage = $"Ошибка: {ex.Message}";
        }
    }

    public class LoginModel
    {
        public LoginModel() { }
        [JsonPropertyName("email")]
        public string Email { get; set; } = string.Empty;
        [JsonPropertyName("password")]
        public string Password { get; set; } = string.Empty;
    }

    public class TokenResponse
    {
        public string Token { get; set; } = string.Empty;
    }
}

Ответы (1 шт):

Автор решения: Dev18

Ваш пример кода в целом рабочий, с ним все нормально. Единственное, вы забыли добавить @rendermode InteractiveServer

Из-за этого Blazor по умолчанию считает, что страница — статическая (в режиме SSR), и форма просто не умеет правильно передавать данные модели при нажатии кнопки. Поэтому loginModel оставался пустым.

@page "/"
@using System.Text.Json.Serialization
@inject HttpClient Http
@inject NavigationManager Navigation
@rendermode InteractiveServer 

<EditForm Model="@loginModel" OnValidSubmit="@HandleLogin" FormName="loginForm">
    <DataAnnotationsValidator />
    <ValidationSummary />
    <div>
        <label>Email:</label>
        <InputText @bind-Value="loginModel.Email" />
    </div>
    <div>
        <label>Пароль:</label>
        <InputText @bind-Value="loginModel.Password" type="password" />
    </div>
    <button type="submit">Войти</button>
</EditForm>

@if (!string.IsNullOrEmpty(errorMessage))
{
    <div class="alert alert-danger">@errorMessage</div>
}

@code {
    private LoginModel loginModel = new LoginModel();
    private string errorMessage;

    private async Task HandleLogin()
    {
        errorMessage = string.Empty;
        try
        {
            var response = await Http.PostAsJsonAsync("api/Auth/login", loginModel);
            if (response.IsSuccessStatusCode)
            {
                var tokenResponse = await response.Content.ReadFromJsonAsync<TokenResponse>();

                Navigation.NavigateTo("/");
            }
            else
            {
                errorMessage = "Ошибка входа. Проверьте правильность данных.";
            }
        }
        catch (Exception ex)
        {
            errorMessage = $"Ошибка: {ex.Message}";
        }
    }

    public class LoginModel
    {
        public LoginModel() { }
        [JsonPropertyName("email")]
        public string Email { get; set; } = string.Empty;
        [JsonPropertyName("password")]
        public string Password { get; set; } = string.Empty;
    }

    public class TokenResponse
    {
        public string Token { get; set; } = string.Empty;
    }
}

введите сюда описание изображения

→ Ссылка