Круговое отображение данных в ASP.NET MVC при использовании связывателей моделей - PullRequest
0 голосов
/ 05 января 2011

Допустим, у меня есть форма со следующим «бизнес-объектом»:

public class MyObject
{
    public string Name { get; set; }
    public User OtherUser { get; set; }
    public DateTime CreateDate { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
}

Когда пользователь вводит данные в любое из полей, мне нужно выполнить обход туда, куда они ввеличтобы разрешить им исправлять любые жирные пометки и тому подобное, без необходимости повторного ввода их ответа.

Поскольку я не могу в обратном порядке обработать значение типа «31 февраля 2011» в поле DateTime, я заканчиваюиспользуя View Model объект, подобный этому:

public class MyObjectViewModel
{
    public string Name { get; set; }
    public string OtherUserName { get; set; }
    public string CreateDate { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
}

Хорошо, все в порядке и превосходно, я могу заставить это отображать точно так же, как пустой бизнес-объект и круглые значения-приступить к использованию следующего шаблона:

public ActionResult Create(FormCollection form)
{
    var model = new MyObjectViewModel();
    if (TryUpdateModel(model, form) && ModelState.IsValid)
    {
         // ...
    }

    return View(model);
}

У меня возникли следующие вопросы:

  1. Какой самый чистый способ вывести данные из модели представления в бизнесОбъект?(т.е. что заполняет остальную часть метода выше?)
  2. Можно ли уменьшить дублирование имен полей между объектами, чтобы объединить мои изменения?
  3. В приведенном выше примереполе OtherUserName - это string, которое необходимо преобразовать в User объект.Чья это ответственность?Контроллер?ViewModel?Модельный переплет?

Ответы [ 3 ]

2 голосов
/ 05 января 2011
  1. AutoMapper
  2. Вам не нужно.
  3. Картограф

Пример:

[HttpPut]
public ActionResult Create(MyObjectViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        // there are validation errors => redisplay the view
        return View(viewModel);
    }
    var model = Mapper.Map<MyObjectViewModel, MyObject>(viewModel);
    _repository.DoSomethingWithTheModel(model);
    return RedirectToAction("Success")
}
0 голосов
/ 05 января 2011

Ваша проблема в основном связана с тем, что модель представления содержит недопустимые данные. Используйте тот же строгий тип в вашей модели представления, что и в вашем классе данных, добавьте небольшую проверку JavaScript, и «31 февраля» никогда не попадет на сервер. Разбор типов определенно является обязанностью связывателя модели - вам не нужно ничего делать, ваше действие контроллера просто передается строго типизированному объекту модели. Однако пользователь может немного отличаться - основное отличие может заключаться в том, что ваша модель представления имеет поле с именем username, а модель данных нуждается в объекте пользователя с информацией, которой нет в форме. Ваш контроллер должен будет выбрать / создать соответствующий объект пользователя и добавить его в класс данных.

После анализа модели все равно будет происходить некоторая проверка на стороне сервера, но это будет более нестандартная вещь, например проверка соответствия полей друг другу, а не просто проблемы формата строки.

Для уменьшения дублирования я разместил свой стиль моделей на другом вопросе - asp.mvc design model

0 голосов
/ 05 января 2011

1) Вы можете строго ввести свой вид, чтобы вид передавал контроллеру тип «MyObject».2) Не уверен, что я понимаю, о чем вы спрашиваете 3) Почему бы не сделать это поле идентификатором, который содержит внешний ключ связанного идентификатора?

Кроме того, нет причины, по которой поле даты и времени не может быть переданопросмотр и возврат влево как есть.Вам не нужно передавать его в виде строки и конвертировать.

PS - я бы порекомендовал посмотреть этот учебник - должен уточнить мои ответы для вас.

http://www.asp.net/mvc/videos/what-is-aspnet-mvc-80-minute-technical-video-for-developers-building-nerddinner

...