Мой код контроллера действий выглядит любительским
Первый пост время,
Я играл с MVC abit... У меня есть представление, которое имеет несколько полей ввода, некоторые из этих полей могут быть пустыми в посте.
Метод действия внутри контроллера для поста выглядит примерно так
public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember)
Я использовал расширение DynamicQuery, которое использовалось для выполнения динамических запросов Linq в моей базе данных, и я инкапсулировал это в объект поиска, который передается на уровень доступа к данным для исполнения.
Однако у меня также есть настроенный объект ViewData, который передается обратно в представление для отображения входных значений и результатов запроса.
Все это выглядит немного неприятно в коде, так как мне нужно установить как свойства объекта поиска, так и ViewDatas.
public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember) {
var search = new Search {
Id = id,
FirstName = firstName,
LastName = lastName,
Member = isMember
};
var memberViewData = new MemberViewData {
Id = id,
FirstName = firstName,
LastName = lastName,
Member = isMember
};
memberViewData.Results = _dataRepository.GetMember(search);
return View("Search", memberViewData);
}
Я слишком обдумываю это и действительно должен просто передать значения в слой доступа к данным и заполнить ViewData в контроллере, или я мог бы использовать гораздо более элегантный шаблон или практику?
Извините, если это кажется дампом, не позволяйте людям отбрасывать идеи и время копаться в структуре.
3 ответа
Согласно вашему фрагменту класс MemberViewData имеет свойство Results в дополнение к свойствам класса Search. Поэтому первым шагом было бы сделать MemberViewData производным от Search и определить конструктор, который принимает экземпляр Search в качестве параметра и присваивает ему его основные свойства. Далее я бы изменил метод действия следующим образом:
public ActionResult Filter(Search search)
{
return View("Search", new MemberViewData(search)
{
Results = _dataRepository.GetMember(search)
});
}
Как упоминал Тадеуш, ModelBinder может помочь вам создать MemberViewData, который оставит только те результаты, которые будут выбраны.
Вы также можете принять решение о создании службы представления, которая понимает, как создать этот объект данных представления, и просто делегировать ему. Я бы предпочел подход связующего модели здесь.