Использование Включить и Исключить в asp.net привязки MVC ИЛИ создать новый объект подмножества? - PullRequest
2 голосов
/ 15 апреля 2009

Имеет ли смысл создавать объект, который содержит только те свойства, которые пользователь будет вводить на веб-странице, использовать его для привязки в контроллере, а затем сопоставлять с полным объектом Entity? Или вам следует просто использовать объект-сущность и использовать Включить и Исключить, чтобы наложить ограничения на то, что связано с вводом?

Ответы [ 2 ]

6 голосов
/ 15 апреля 2009

Мне понравилась идея использования интерфейсов для разделения того, какие свойства должны быть включены при обновлении объекта.

Например:

Чтобы создать и обновить объект person:

interface ICreatePerson
{
  string Name { get; set; }
  string Sex { get; set; }
  int Age { get; set; }
}

interface IUpdatePerson 
{
  string Name { get; set; }
}

class Person : ICreatePerson, IUpdatePerson
{
  public int Id { get; }
  public string Name { get; set; }
  public string Sex { get; set; }
  public int Age { get; set; }
}

Затем при привязке модели просто используйте соответствующий интерфейс в качестве типа, и он только обновит свойство name.

Вот пример метода контроллера:

public ActionResult Edit(int id, FormCollection collection)
{
    // Get orig person from db
    var person = this.personService.Get(id);

    try
    {
        // Update person from web form
        UpdateModel<IUpdatePerson>(person);

        // Save person to db
        this.personService.Update(person);

        return RedirectToAction("Index");
    }
    catch
    {
        ModelState.AddModelErrors((person.GetRuleViolations());

        return View(person);
    }
}

См. эту статью (и комментарии) для очень хорошего обсуждения вариантов.

4 голосов
/ 15 апреля 2009

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

  • Презентационные модели позволяют разрабатывать «в первую очередь». Создайте представление и модель презентации одновременно. Получите ваш пользовательский представитель, чтобы дать вам отзыв о представлении. Итерируйте, пока вы оба не будете счастливы. Наконец, решите проблему сопоставления этого с «реальной» моделью.
  • Презентационные модели удаляют зависимости, которые может иметь «реальная» модель, что позволяет упростить модульное тестирование контроллеров.
  • Модели презентаций будут иметь ту же «форму», что и само представление. Таким образом, вам не нужно писать код в представлении, чтобы иметь дело с переходом к «подробным объектам» и т. П.
  • Некоторые модели нельзя использовать в результате действия. Например, граф объектов, содержащий циклы, нельзя сериализовать в JSON.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...