Как создать сложный EditorTemplate в ASP.NET MVC 5 с запросом БД?

Я хотел бы создать более сложный EditorTemplate выбрать клиента из списка.

Я знаю о DropDownListFor, но я хотел бы показать карты с фотографиями клиентов и некоторыми данными, а не только обычные select список.

Что я хотел бы сделать:

создать EditorTemplate для выбора клиента, например... В любом классе POCO

public class X{

    [Key] int Id {get;set;}

    [UIHint("CustomerSelector")] int Custumer_Id {get;set;}

}

И "CustomerSelectorРедактор шаблонов сможет опрашивать всех клиентов и показывать их в расширенном списке.

Список клиентов

В чем проблема:

  • Не стоит добавлять логику запросов из представления. Это против паттерна MVC.
  • Не очень модульно запрашивать список клиентов на каждом контроллере и передавать его в качестве аргумента в EditorTemplate.

Как я могу создать этот EditorTemplate без путаницы с шаблоном MVC или дублирования кода в каждом контроллере?

1 ответ

Решение

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

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

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

@Html.Action("CustomerSelect", new { fieldName = "Customer_Id" })

Это тоже не совсем идеально, так как теперь у вас есть строка, которую вы должны отслеживать, и вам нужно быть осторожным с тем, чтобы действительно дать правильное имя. Например, если бы это была коллекция предметов, то вам действительно нужно было бы передать что-то вроде "MyCollection[" + i.ToString() + "].Customer_Id", Вы можете видеть, что это начинает быстро становиться грязным. Только по этой причине я бы почти исключил это как возможное решение.

Последний вариант - использовать HtmlHelper расширение. Это имеет ту же проблему, что и шаблон редактора, в том смысле, что вам придется создавать новый экземпляр вашего контекста, но, по крайней мере, лучше, если этого не делать в представлении Razor.

Другие вопросы по тегам