2011-01-05 1 views
0

Допустим, у меня есть форма со следующим «бизнес-объекта» в виду:кругооборота просмотр данных в ASP.NET MVC при использовании модели Биндеры

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; } 
} 

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

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? Модель связующего?

ответ

-1

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

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

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

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

+0

1) Во-первых, мои взгляды сильно типизированных. Кроме того, нет, если я это сделаю, данные не будут проходить в оба конца, и я не смогу обновить существующий объект базы данных таким образом. 3) Вы хотите, чтобы я сделал тип пользователя в ID объектов в базе данных? Я не думаю, что это будет хорошо. –

+0

1) Тогда самым чистым способом является указание контроллеру ожидать типа «MyObject» вместо FormCollection. Если вы используете строго типизированное представление, привязка так же просто. 3) Нет, я обычно возвращаю дружественное имя через JSON/AJAX и привязываю его к выпадающему списку. Затем пользователь может выбрать это, но идентификатор передается контроллеру (вам нужна помощь javascript для этого - его необходимо в представлении, чтобы привязать выбранный ID к полю скрытой модели). –

0

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

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

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

2
  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") 
} 
+1

+100 для AutoMapper. Чтобы усилить № 2, устранение дубликатов, imo, не должно быть самой сильной мотивацией. Кажется, я обнаружил дублирование в определенных точках - ViewModels как пограничный переход уровня приложения, являющийся одной из таких точек, - имеет чистое сокращение сложности. То есть, да, наличие некоторых объектов, которые окружают друг друга, добавляет сложности. Но эта сложность относительно небольшая. Уменьшение связи между представлениями и доменами имеет больший эффект, опять же imo. –

+0

Интересно ... Будет ли automapper обновлять свойства существующего объекта? –

+0

@John, AutoMapper автоматически отображает свойства с одинаковыми именами. Если есть разные имена/правила, вам нужно их определить. –

 Смежные вопросы

  • Нет связанных вопросов^_^