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

StackOverflow https://stackoverflow.com/questions/884574

  •  23-08-2019
  •  | 
  •  

Вопрос

Время первого поста,

Я немного поигрался с MVC...У меня есть представление, которое имеет несколько полей ввода, некоторые из этих полей могут быть пустыми при публикации.

Метод действия внутри контроллера для публикации выглядит примерно так

public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember)

Я использовал расширение DynamicQuery, которое используется для выполнения динамических запросов Linq к моей базе данных, и я инкапсулировал это в объект поиска, который передается на уровень доступа к данным для выполнения.

Однако у меня также есть настроенный объект ViewData, который передается обратно в представление для отображения входных значений и результатов запроса.

В коде все это выглядит немного неприятно, поскольку мне приходится устанавливать как свойства объекта поиска, так и ViewData.

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 в контроллере, или есть гораздо более элегантный шаблон или практика, которую я мог бы использовать?

Извините, если это кажется глупостью, не так много людей, которые могли бы поделиться идеями, и время, чтобы покопаться в структуре.

Это было полезно?

Решение

Согласно вашему фрагменту, класс MemberViewData имеет свойство Results в дополнение к свойствам класса Search.Поэтому первым шагом было бы сделать MemberViewData производным от Search и определить конструктор, который принимает экземпляр Search в качестве параметра и присваивает ему основные свойства.Далее я бы изменил метод действия следующим образом:

public ActionResult Filter(Search search)  
{ 
    return View("Search", new MemberViewData(search) 
    {
        Results = _dataRepository.GetMember(search)
    }); 
}

Другие советы

Используйте modelbinder для привязки данных

Как упомянул Тадеуш, ModelBinder может помочь вам создать MemberViewData, в результате чего для извлечения останутся только результаты.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top