asp.net mvc viewmodels.Сколько логики (если есть) они должны содержать - PullRequest
5 голосов
/ 17 июня 2010

Я изучал модели для mvc и ищу лучший способ сделать это.Я прочитал множество разных статей, но ни одна из них не кажется мне «лучшим способом».Пока что у меня может быть модель Customer со следующими свойствами:

  • Имя
  • Фамилия
  • Заголовок
  • Местоположение

Где location - это внешний ключ для таблицы местоположений в базе данных.

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

Теперь из того, что я прочитал, у меня есть следующие варианты (возможно, их гораздо больше).

Так что мой вопросв принципе, какой из них лучший?

1)

Добавить список выбора в ViewData["Location"] и просто создать строго типизированное представление клиента?

2)

Создайте модель представления, где я передаю клиента и выбираю список (доступ к данным осуществляется в контроллере):

public class ViewModelTest
{
    public Customer Customer { get; set; }
    public SelectList Locations { get; set; }

    public ViewModelTest(Customer customer, SelectList locations)
    {
        Customer = customer;
        Locations = locations;
    }
}

3)

Создание модели представления, гдеЯ передаю клиента и список местоположений и создаю список выбора в модели представления.

public class ViewModelTest
{
    public Customer Customer { get; set; }
    public SelectList Locations { get; set; }

    public ViewModelTest(Customer customer, List<Location> locations, string selectedLocation)
    {
        Customer = customer;
        Locations = new SelectList(locations, "LocationID", "LocationName", selectedLocation);
    }
}

4)

Передача клиента и хранилища и доступ к данным в модели представления.

public class ViewModelTest
{
    public Customer Customer { get; set; }
    public SelectList Locations { get; set; }

    public ViewModelTest(Customer customer, IRepository repository, string selectedLocation)
    {
        Customer = customer;
        Locations = new SelectList(repository.GetLocations(), "LocationID", "LocationName", selectedLocation);
    }
}

5)

Создайте модель представления, используя только те свойства, которые мне нужны:

public class ViewModelTest
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public SelectList Locations { get; set; }

    public ViewModelTest(Customer customer, SelectList locations)
    {
        FirstName = customer.FirstName;
        LastName = customer.LastName ;
        Locations = locations;
    }
}

6)

Или некоторая другая комбинациявыше или иначе.

Все мнения приветствуются.

Ответы [ 2 ]

6 голосов
/ 17 июня 2010

Вот что я могу предложить: иметь модель представления, которая отражает поля строго типизированного представления:

public class SomeViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Location { get; set; }
    public IEnumerable<SelectListItem> PossibleLocations { get; set; }
}

И в вашем действии контроллера заполните эту модель представления:

public ActionResult Index()
{
    var customer = Repository.GetCustomer();
    var locations = Repository.GetLocations();
    var viewModel = new SomeViewModel
    {
        FirstName = customer.FirstName,
        LastName = customer.LastName,
        Location = customer.Location,
        PossibleLocations = new SelectList(locations, "LocationID", "LocationName", customer.Location);
    };
    return View(viewModel);
}

[HttpPost]
public ActionResult Index(SomeViewModel viewModel)
{
    // TODO: Handle the form submission
    return View(viewModel);
}

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

2 голосов
/ 17 июня 2010

У меня будет моя ViewModel как это

public class SomeViewModel 
{ 
    public Customer Customer { get; set; } 
    public IEnumerable<Location> PossibleLocations { get; set; } 
} 

Мой контроллер такой:

public ActionResult Index()   
{     
    var viewModel = new SomeViewModel   
    {   
        Customer = Repository.GetCustomer(),
        PossibleLocations = Repository.GetLocations()
    };   
    return View(viewModel);   
}

и затем вы можете получить доступ ко всему в вашем объекте Customer в виде, подобном этому:

Customer name - <%: Model.Customer.FirstName %> <%: Model.Customer.LastName %>
Location - <%: Html.DropDownList("LocationID", new SelectList(Model.PossibleLocations as IEnumerable, "LocationID", "LocationName", Model.Location.LocationID))%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...