#asp.net-mvc-3 #validation
#asp.net-mvc-3 #проверка
Вопрос:
У меня есть проект Razor MVC3, в котором есть две записи пользователя в форме, одна для ключевого контакта и одна для резервного контакта. Например;
public class User
{
[Required(ErrorMessage = "First name is required")]
public string FirstName { get; set; }
}
Проверка работает хорошо, за исключением небольшой проблемы, когда пользователь не может заполнить поле, в нем написано «Требуется имя», но я хотел бы указать пользователю, в котором отсутствует одно из полей имени. Например, «Требуется имя резервного контакта» или «Требуется имя ключевого контакта».
В идеале я хотел бы оставить аннотацию [Required] в классе, поскольку она используется в другом месте.
Это похоже на один из тех небольших случаев, которые могли быть пропущены и которые нелегко достичь, но, пожалуйста, докажите, что я ошибаюсь.
Райан
Комментарии:
1. Вы всегда можете делегировать фактическое сообщение об ошибке и просто сохранить требуемый атрибут. Затем действие должно было бы выбрать правильное сообщение об ошибке.
Ответ №1:
Один из способов добиться этого — использовать отдельную модель представления для этого экрана вместо однопользовательской модели со всеми сообщениями об ошибках. В новой модели представления у вас может быть свойство BackupContactFirstName, свойство KeyContactFirstName и т.д., Каждое Со своим отдельным сообщением об ошибке. (Альтернативно, эта модель представления могла бы содержать отдельные пользовательские модели в качестве свойств, но я обнаружил, что проверка клиента Microsoft плохо работает со сложными моделями и предпочитает плоские свойства).
Ваша модель представления будет выглядеть следующим образом:
public class MySpecialScreenViewModel
{
[Required(ErrorMessage = "Backup contact first name is required")]
public string BackupContactFirstName { get; set; }
[Required(ErrorMessage = "Key contact first name is required")]
public string KeyContactFirstName { get; set; }
}
Затем передайте свою модель представления в представление следующим образом:
@model MySpecialScreenViewModel
...
Ваше действие post controller будет собирать свойства из модели представления (или сопоставлять их с отдельными пользовательскими моделями) и передавать их соответствующим методам обработки данных.
Комментарии:
1. Это «способ» 🙂 ваша модель представления должна соответствовать форме. Сейчас не очень хорошо обрабатываются любые абстракции. Однако, учитывая их стремление к EditorFor и шаблонам Editor, было бы неплохо, чтобы MS больше инвестировала в проверку сложных типов в будущем.
Ответ №2:
Альтернативный вариант, на который я наткнулся, просто измените коллекцию ModelState. В нем будут элементы коллекции с именем по индексу, например ‘User_0__EmailAddress’, и вы можете настроить / изменить / заменить коллекцию ошибок, связанную с этим ключом.
Ответ №3:
[Required(ErrorMessage = "{0} is required")]
{0}= В него автоматически помещается DisplayName
пример
[DisplayName("Amount per square meter")]
[Required(ErrorMessage = "{0} is required")]
public int PriceMeter { get; set; }
вывод
Требуется количество на квадратный метр