Я использую DataAnnotations
атрибуты для проверки объектов моей модели. Мой модельный класс выглядит примерно так:
public class MyModel
{
[Required]
public string Title { get; set; }
[Required(ErrorMessage = "At least one editor is required.")]
public List<User> Editors { get; set; }
}
public class User
{
public int Id { get; set; }
[Required]
public string FullName { get; set; }
[Required]
[DataType(DataType.Email)]
public string Email { get; set; }
}
Действие моего контроллера выглядит так:
public ActionResult NewItem(MyModel data)
{
if (!this.Model.IsValid)
{
// invalid processing
}
// valid processing
}
Пользователю предоставляется представление, имеющее форму с:
- текстовое поле с фиктивным именем, где пользователи вводят имена пользователей. Для каждого пользователя, которого они вводят, есть клиентский скрипт в сочетании с ajax, который создает
<input type="hidden" name="Editors[0].Id" value="userId" />
для каждого введенного пользователя (поэтому индекс перечисления не всегда равен 0, как здесь написано), поэтому механизм связывания по умолчанию может использовать и связывать форму без каких-либо проблемы.
- текстовое поле, в котором пользователи вводят заголовок
Поскольку я использую Asp.net MVC 2 RTM , который выполняет проверку модели вместо проверки ввода, я не знаю, как избежать ошибок проверки. И поскольку пользователи предоставляют User.Id
, весь экземпляр объекта User
проверяется. Что меня не беспокоит, пока я знаю, как исключить проверку других свойств.
Дело в том, что я должен использовать BindAttribute
в своем действии контроллера. Я должен был бы предоставить белый или черный список свойств. Лучше всегда предоставлять белый список. Это также более надежное будущее.
Проблема
Моя форма работает нормально, но я получаю ошибки проверки свойств пользователя FullName
и Email
, поскольку они не предоставлены. Я также не должен передавать их клиенту (через ajax, когда пользователь вводит данные пользователя), потому что электронная почта является личной контактной информацией и не передается между пользователями.
Если бы на * 1032 была только одна ссылка на пользователя, я бы написал
[Bind(Include = "Title, Editor.Id")]
Но у меня есть их перечень. Как мне предоставить Bind
белый список для работы с моей моделью?
Одно из возможных решений
Я мог бы создать отдельную модель представления для User
только для ввода объектов MyModel. Я бы поставил действительные атрибуты проверки и пропустил ненужные мне свойства.
public class MyModelUser
{
[Required]
public int Id { get; set; }
}