Проверка модели с перечислимыми свойствами в Asp.net MVC2 RTM
-
21-09-2019 - |
Вопрос
Я использую 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, как написано здесь), поэтому связующее по умолчанию model binder может использовать и привязывать форму без каких-либо проблем. - текстовое поле, в которое пользователи вводят заголовок
Так как я использую Asp.net MVC 2 RTM который выполняет проверку модели вместо проверки входных данных, я не знаю, как избежать ошибок проверки.И поскольку пользователи предоставляют User.Id
, весь User
экземпляр объекта проходит проверку.Что меня не беспокоит, пока я буду знать, как исключить проверку других свойств.
Дело в том, что я должен использовать BindAttribute
о моем действии контроллера.Мне пришлось бы либо предоставить белый, либо черный список свойств.Всегда лучше составлять белый список.Это также больше похоже на будущее.
Проблема
Моя форма работает нормально, но я получаю ошибки проверки о пользовательском FullName
и Email
свойства, поскольку они не предоставлены.Я также не должен передавать их клиенту (через ajax, когда пользователь вводит пользовательские данные), потому что электронная почта является личными контактными данными и не передается между пользователями.
Если бы была только одна ссылка на пользователя на MyModel
Я бы написал
[Bind(Include = "Title, Editor.Id")]
Но у меня есть их перечисление. Как я могу предоставить Bind
белый список для работы с моей моделью?
Одно из возможных решений
Я мог бы создать отдельную модель представления для User
просто ради ввода объектов MyModel.Я бы поместил фактические атрибуты проверки и опустил свойства, которые мне не нужны.
public class MyModelUser
{
[Required]
public int Id { get; set; }
}
Решение
В итоге я использовал отдельную модель представления (как описано в Одно из возможных решений в моем вопросе), это может быть полностью подтверждено.Это обходной путь, и я все еще хотел бы знать, как это сделать правильно.