Мой код контроллера действий выглядит любительским

Первый пост время,

Я играл с 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, который оставит только те результаты, которые будут выбраны.

Вы также можете принять решение о создании службы представления, которая понимает, как создать этот объект данных представления, и просто делегировать ему. Я бы предпочел подход связующего модели здесь.

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