#asp.net-core #data-annotations
#asp.сетевое ядро #данные-аннотации
Вопрос:
Использование ASP.Net Ядро, я разрабатываю простую форму для сброса пароля с помощью адреса электронной почты. Моя модель выглядит следующим образом:
public class EmailViewModel { [Required(ErrorMessageResourceName = "Model_RequireEmail", ErrorMessageResourceType = typeof(Resources.Identity))] [Display(Name = "Models_Account_Email", ResourceType = typeof(Resources.Identity))] [DataType(DataType.EmailAddress)] [EmailAddress(ErrorMessage = "Models.EmailFormat")] [MaxLength(100, ErrorMessage = "Models.MaxLength")] public string? Email { get; set; } }
И мое мнение:
lt;form method="post"gt; lt;div class="uk-text-danger"gt; @Html.ValidationSummary() lt;/divgt; lt;div class="uk-margin"gt; lt;div class="uk-inline"gt; lt;span class="uk-form-icon" uk-icon="icon: mail"gt;lt;/spangt; @Html.TextBoxFor(m =gt; m.Data.EmailViewModel.Email, new { @class = "validate uk-input", placeholder = Html.DisplayNameFor(m =gt; m.Data.EmailViewModel.Email) }) @Html.HiddenFor(m =gt; m.Data.ResetPasswordAction) @Html.HiddenFor(m =gt; m.Data.ResetPasswordController) lt;/divgt; lt;/divgt; lt;button class="uk-button uk-button-default"gt;@Html.LocalizedIdentity("Views.Account.PassReset")lt;/buttongt; lt;/formgt;
Моя проблема в том, что даже если я указываю правильный адрес электронной почты, я продолжаю получать сообщение с «требуемой» аннотацией данных. Что я пропустил?
ИЗМЕНИТЬ 13/12/2021
Проблема возникает, когда я использовал вложенную модель представления. Например, модель представления, связанная с моей формой, является
public class ForgotPasswordViewModel { public EmailViewModel EmailViewModel =gt; new EmailViewModel(); [HiddenInput] public string? ResetPasswordAction { get; set; } [HiddenInput] public string? ResetPasswordController { get; set; } }
используя приведенную выше модель электронной почты. Это дает состояние модели.isValid= false, потому что электронное письмо равно нулю, даже если оно указано.
Если я обойду модель электронной почты и использую для своего режима ForgotPasswordViewMode, следующее:
public class ForgotPasswordViewModel { [Display(Name = "Models_Account_Email", ResourceType = typeof(Resources.Identity))] [Required] [DataType(DataType.EmailAddress)] [EmailAddress(ErrorMessage = "Models.EmailFormat")] [MaxLength(100, ErrorMessage = "Models.MaxLength")] public string? Email { get; set; } [HiddenInput] public string? ResetPasswordAction { get; set; } [HiddenInput] public string? ResetPasswordController { get; set; } }
Это прекрасно работает.
Проблема в том, что я хочу использовать вложенную модель представления, чтобы избежать ее повторения.
Почему он не работает с вложенной моделью EmailViewModel?
Ответ №1:
Это моя модель и мое тестовое представление, это приведет к ModelState.IsValid == false
тому, что форма ввода должна иметь свойство emailVM.Email
, но не EmailViewModel
.
public class EmailViewModel { //[Required(ErrorMessageResourceName = "Model_RequireEmail", ErrorMessageResourceType = typeof(Resources.Identity))] //[Display(Name = "Models_Account_Email", ResourceType = typeof(Resources.Identity))] [Display(Name = "Models_Account_Email")] [Required] [DataType(DataType.EmailAddress)] [EmailAddress(ErrorMessage = "Models.EmailFormat")] [MaxLength(100, ErrorMessage = "Models.MaxLength")] public string? Email { get; set; } } public class ForgotPasswordViewModel { //public EmailViewModel emailVM =gt; new EmailViewModel(); public EmailViewModel emailVM { get; set; } [HiddenInput] public string? ResetPasswordAction { get; set; } [HiddenInput] public string? ResetPasswordController { get; set; } } lt;form method="POST" asp-action="Edit"gt; lt;div class="uk-text-danger"gt; @Html.ValidationSummary() lt;/divgt; lt;div class="uk-inline"gt; lt;span class="uk-form-icon" uk-icon="icon: mail"gt;lt;/spangt; @Html.TextBoxFor(m =gt; m.emailVM.Email, new { placeholder = Html.DisplayNameFor(m =gt; m.emailVM.Email) }) lt;/divgt; lt;div class="form-group"gt; lt;input type="submit" value="Save" class="btn btn-primary" /gt; lt;/divgt; lt;/formgt;
Комментарии:
1. Спасибо @Tiny-Wang. Я получил ошибку, когда использовал вложенную модель представления. Модель электронной почты вложена в модель forgotpasswordviewмодель, которая прикреплена к моей форме. Я не понимаю, почему.
2. Сначала вы должны заменить
public EmailViewModel EmailViewModel =gt; new EmailViewModel();
наpublic EmailViewModel emailVM { get; set; }
, затем в вашем cshtml вы должны использоватьForgotPasswordViewModel
в качестве модели , ваш контроллер также должен получатьForgotPasswordViewModel
в качестве входного параметра, я изменю свой ответ.