Я изучал модели представления для mvc, и я ищу лучший способ сделать их. Я считал загрузки различных статей, но ни один, кажется, не ясен как "лучший способ". До сих пор пример у меня могла бы быть модель Customer со следующими свойствами:
Где местоположение является внешним ключом к таблице местоположения в базе данных.
Я хочу смочь отредактировать этого клиента, но только имя, фамилию и местоположение. Я не побеспокоен о заголовке в редактировании. Таким образом, по моему мнению, я должен буду передать клиента и выбранный список.
Теперь от того, что я считал, у меня есть следующие опции (существует, вероятно, намного больше).
Таким образом, мой вопрос в основном, который является лучшим?
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)
Или некоторая другая комбинация вышеупомянутого или иначе.
Все приветствующиеся мнения.
Вот что я могу предложить: иметь модель представления, которая отражает поля строго типизированного представления:
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 .
Я бы использовал модель 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))%>