asp.net mvc viewmodels. Сколько логика (если таковые имеются) должна они содержать

Я изучал модели представления для 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)

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

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

5
задан lancscoder 17 June 2010 в 10:21
поделиться

2 ответа

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

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 .

6
ответ дан 14 December 2019 в 04:30
поделиться

Я бы использовал модель 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))%>
2
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: