Pergunta

Primeiro post tempo,

Eu fui brincar com MVC abit ... Eu tenho uma visão que tem vários campos de entrada, alguns desses campos podem estar em branco no post.

O método de ação dentro do controlador para o cargo é algo como isto

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

Eu estive usando a extensão DynamicQuery que foi retroceder ao redor, a fim de realizar querys Linq dinâmicas no meu banco de dados e eu encapsulado isso em um objeto de pesquisa que é passado para a camada de acesso a dados para execusion.

No entanto, eu também tenho um objeto ViewData personalizado que é passado de volta para o ponto de vista para exibir os valores de entrada e os resultados da consulta.

Tudo parece um pouco desagradáveis ??no código como eu estou tendo que definir tanto as propriedades Pesquisa objeto eo 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); 

}

Am I pensando sobre isso e realmente deve apenas passar os valores para a camada de acesso a dados e preencher o ViewData no controlador, ou há um padrão muito mais elegante ou praticar eu poderia usar?

Desculpe se isso parece despejo, não colocar de pessoas para idéias saltar fora e tempo para cavar o quadro.

Foi útil?

Solução

De acordo com o snippet de classe MemberViewData tem a propriedade Os resultados, além de propriedades de Pesquisa classe. Então, primeiro passo seria fazer MemberViewData derivam de Pesquisa e definir um construtor que aceita Pesquisa instância como parâmetro e atribui a ele de propriedades básicas a partir dele. Em seguida gostaria de alterar o método de ação como assim:

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

Outras dicas

Use ModelBinder aos dados de vinculação

Como Tadeusz mencionado, uma ModelBinder pode ajudar a construir o MemberViewData para você, o que deixaria apenas os resultados sejam obtidos.

Você também pode decidir sobre a criação de um serviço de apresentação que entende como construir este objeto de exibição de dados e simplesmente delegar a ele. Eu prefiro a abordagem de modelo de pasta aqui embora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top