Как создать сложный 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.