У меня есть модель EF Code First, которую я редактирую через страницу MVC, с определенным полем, которое всегда возвращает false с аннотацией [Required] данных. Если я жестко установлю значение прямо перед проверкой, оно все равно не будет выполнено.
Это для объекта User, который я могу настроить, если я использую имя пользователя или адрес электронной почты в качестве свойства 'username'.
Модель:
public class User {
[DisplayName("User Id")]
public int Id { get; set; }
[Required(ErrorMessage="Username is required")]
public string Username { get; set; }
[UIHint("EmailAddress")]
[Required(ErrorMessage = "Email is required")]
[EmailAddress]
public string Email { get; set; }
}
На мой взгляд, я рисую Username
редактор, только если он необходим:
@if (@ViewBag.LoginMethod == "username") {
@Html.LabelFor(m => m.Username)
@Html.TextBoxFor(m => m.Username, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Username)
}
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Email)
Мой контроллер:
[HttpPost]
public ActionResult Create(UserModel viewModel) {
ViewBag.LoginMethod = this.loginMethod.ToString();
var user = new User();
if (this.loginMethod == LoginMethods.Username)
user.Username = viewModel.User.Username;
else
user.Username = viewModel.User.Email;
user.Email = viewModel.User.Email;
user.FirstName = viewModel.User.FirstName;
user.LastName = viewModel.User.LastName;
user.Username = "TEST";
if (TryValidateModel(user) == false) {
this.FlashError("Validation Errors!");
return View(viewModel);
}
throw new Exception("here");
}
Как видите, я устанавливаю свойство User.Username, основываясь на методе входа в систему. Ради тестирования я устанавливаю его на "ТЕСТ" прямо перед проверкой.
Проверка «Требуется имя пользователя» возвращает ложь, и я снова оказываюсь в своем представлении. Я никогда не получаю исключение.
Мне удалось заставить его работать правильно, отобразив редактор имени пользователя на странице, несмотря ни на что. Поскольку у меня включена проверка на стороне клиента, я не могу отправить форму без ввода значения, и она работает - даже если значение имени пользователя по-прежнему равно «TEST» после проверки.
Я начинаю думать, что TryValidateModel
не правильная функция. Использование ModelState.IsValid
дает тот же результат - неверный Обязательный сбой.