Привязка модели страниц Blazor SSR

Согласно этой странице документации Microsoft, следующий код должен отображать страницу, которая позволяет пользователю вводить данные формы, а нажатие кнопки отправки должно привести к выполнению метода Save, в то время как Model содержит привязку состояния из отправленной формы.

Когда я запускаю его, значения Person всегда равны null.

@page "/"
<PageTitle>Home</PageTitle>

<form @formname = "MyForm" method=post @onsubmit=Save>
    <AntiforgeryToken />
    Salutation <input name = "Salutation" [email protected] /><br/>
    Personal name <input name = "PersonalName" [email protected] /><br />
    Family name <input name = "FamilyName" [email protected] /><br />
    <button type=submit>Save</button>
</form>


@code {
    public class Person
    {
        public string? Salutation { get; set; }
        public string? PersonalName { get; set; }
        public string? FamilyName { get; set; }
    }

    [SupplyParameterFromForm(FormName = "MyForm")]
    public required Person Model { get; set; }

    protected override void OnInitialized()
    {
        base.OnInitialized();
        Model ??= new();
    }

    private void Save()
    {
        if (Model?.Salutation is null)
            throw new NullReferenceException("This should not happen");
    }
}

Здесь вам понадобится правильное имя HTML-поля: github.com/dotnet/aspnetcore/issues/…

VahidN 25.06.2024 17:37
Для развертывания Сайтов с использованием Blazor, Angular и React с репозиторием на GitHub на Cloudflare
Для развертывания Сайтов с использованием Blazor, Angular и React с репозиторием на GitHub на Cloudflare
Как развернуть сайты с помощью Blazor, Angular и React с репозиторием на GitHub на Cloudflare.
0
1
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код отличается от примера StarShip тремя способами. Все кажется критическим.

  1. Вы ставите name.

  2. Вы используете необработанный input, а в примерах — InputText.

  3. Вы не привязываете входные данные к модели двусторонней, а только односторонней привязке с помощью value=.

Важным моментом является name. Он должен соответствовать формату class.propertyname.

Итак, это работает:

@page "/"

<PageTitle>Home</PageTitle>

 <form @formname = "Home" method = "post" @onsubmit = "this.Save">

    <AntiforgeryToken />
    Salutation: <input class = "mb-3" name = "Model.Salutation" value = "this.Model.Salutation" /><br />
    Personal name: <input class = "mb-3" name = "Model.PersonalName" value = "this.Model.PersonalName" /><br />
    Family name: <input class = "mb-3" name = "Model.FamilyName" value = "this.Model.FamilyName" /><br />

    <button type=submit>Save</button>

</form>

@code {
    [SupplyParameterFromForm]
    public required Person Model { get; set; }

    protected override void OnInitialized()
    {
        this.Model ??= new();
    }

    private void Save()
    {
        if (Model?.Salutation is null)
            throw new NullReferenceException("This should not happen");
    }

    public class Person
    {
        public string? Salutation { get; set; }
        public string? PersonalName { get; set; }
        public string? FamilyName { get; set; }
    }
}

InputText автоматически добавляет поле имени.

Ответ заключался в том, что атрибуту name на каждом входе также требуется имя свойства, к которому оно привязано. Поэтому вместо Salutation должно быть Model.Salutation.

Peter Morris 26.06.2024 15:12

Интересно, я не пробовал. Добавление имени модели.имя_свойства в качестве имени решило другие проблемы, которые я обнаружил. Нет необходимости в привязке.

MrC aka Shaun Curtis 26.06.2024 16:00

Компонент <InputText> добавляет атрибут name. Вы можете увидеть это в сгенерированном HTML. Если вы хотите включить эту дополнительную информацию в свой ответ, я с радостью ее приму.

Peter Morris 26.06.2024 19:01

Все объяснено. Я обновил ответ, чтобы отразить новые знания.

MrC aka Shaun Curtis 27.06.2024 00:47

Фантастика, спасибо. Ответ принят!

Peter Morris 28.06.2024 16:01

Другие вопросы по теме