Проверка модели с перечисляемыми свойствами в Asp.net MVC2 RTM - PullRequest
1 голос
/ 19 марта 2010

Я использую 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; }
}

1 Ответ

1 голос
/ 22 марта 2010

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

...