Требуемое сообщение отображается, даже если поле указано C#

#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 в качестве входного параметра, я изменю свой ответ.