Проверка модели с перечислимыми свойствами в Asp.net MVC2 RTM

StackOverflow https://stackoverflow.com/questions/2473976

Вопрос

Я использую 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; }
}
Это было полезно?

Решение

В итоге я использовал отдельную модель представления (как описано в Одно из возможных решений в моем вопросе), это может быть полностью подтверждено.Это обходной путь, и я все еще хотел бы знать, как это сделать правильно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top