Как мне показать другое требуемое сообщение экземплярам одного и того же объекта в MVC3?

#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; }
  

вывод

Требуется количество на квадратный метр