ASP. Net Приложение Core Razor Pages не привязано к свойству в модели - PullRequest
0 голосов
/ 07 августа 2020

У меня есть страница входа в систему, в модели страницы есть свойство LoginDTO (мой собственный класс). Внутри всего две строки - имя пользователя и пароль.

На странице входа у меня есть форма входа в систему с двумя полями, вы, вероятно, можете догадаться, какие они. Код здесь:

<div class="form-group">
    <input class="form-control" type="email" name="email" placeholder="Email" asp-for="LoginDTO.Username">
</div>
<div class="form-group">
    <input class="form-control" type="password" name="password" placeholder="Password" asp-for="LoginDTO.Password">
</div>

Я заполняю поля ввода и нажимаю «Отправить» (метод формы установлен как POST, у меня есть метод OnPost в модели страницы для его обработки), для некоторых причина LoginDTO.Username имеет значение null, но заполнено LoginDTO.Password ?? Следовательно, конечно, ModelState недействителен и нет строки Username для использования.

Как это может быть? Я попытался переименовать переменную и установить ее как value="@Model.LoginDTO.Username" вместо использования asp-for, это не имело никакого значения.

Кто-нибудь может помочь?

ОБНОВЛЕНИЕ: Я изменил Username свойство на Email и теперь оно заработало ?! Почему название этих свойств влияет на возможность присвоения им значений?!?!

1 Ответ

1 голос
/ 07 августа 2020

Я изменил свойство Username на Email, и теперь оно начало работать ?! Почему имя этих свойств влияет на то, могут ли им присваиваться значения?!?!

Во-первых, вам нужно знать, что для каждого свойства сложного типа привязка модели просматривает источники для имени узор prefix.property_name. Если ничего не найдено, ищется только property_name без префикса.

Ссылка:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-3.1#complex -типы

Тогда вам нужно знайте, что помощник тега asp-for по умолчанию сгенерирует html, как показано ниже:

<input id="LoginDTO_Username" name="LoginDTO.Username">

Но вы добавляете свойство name к элементу ввода, чтобы он переопределил свойство name, он отобразит html, как показано ниже:

<input id="LoginDTO_Username" name="email">

Таким образом, система привязки модели не смогла найти источник username. Вот почему она может работать после того, как вы измените свойство Username на Email.

Для вашего сценария, если вы не хотите изменять имя свойства модели, вы можете изменить, как показано ниже:

<input class="form-control" type="email" name="username" placeholder="Email" asp-for="LoginDTO.Username">

Или просто используя помощник тега asp-for:

<div class="form-group">
    <input class="form-control" type="email" placeholder="Email" asp-for="LoginDTO.Username">
</div>
<div class="form-group">
    <input class="form-control" type="password" placeholder="Password" asp-for="LoginDTO.Password">
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...