Pergunta

Eu estava apenas assistindo a apresentação de Scott Hanselman no ASP.NET MVC em São Francisco. Depois de pensar nisso por um tempo, fiquei perplexo sobre como a melhor abordando a criação de um site baseado em MVC do ASP.NET que possui uma estrutura [Portal | Modular | Multi-View] (escolha sua definição favorita).

Para dar uma idéia do que estou procurando, minha empresa cria muitos aplicativos de estilo portal para clientes que incorporam um módulo de mapeamento que pode responder às suas próprias seqüências de consultas e rotas, módulo de informação de encomenda tributária que, da mesma forma, possui seu próprio Visualização (s), visualização de recuperação de documentos que exibe documentos únicos e múltiplos ... você obtém a ideia. A parte crítica é que cada módulo é realmente independente. Se um usuário procurar um registro fiscal pelo nome, poderá ver 10 resultados ("John Doe" possui algumas propriedades). Cada resultado possui um link "Map It" porque a estrutura do aplicativo do site sabe que existe um módulo de mapa disponível. O link "mapa it" envia a solicitação certa como http://myapp.com/taxparcel/map/123443. O controlador do módulo de mapa responde à solicitação externa, ampliando o mapa e destacando a parcela tributária.

A chave para todo esse fluxo é que Ambas Os módulos de imposto e mapeamento estão na mesma página da web.

Então, como isso se encaixa na caixa ASP.NET MVC? Parciais? Sub Views? Vistas de várias visualizações para um único controlador? Se estou perdendo a parte óbvia da documentação, fique à vontade para me criticar publicamente e incluir o link. Caso contrário, estou bem aberto a sugestões.

Foi útil?

Solução

Bem, seu modelo de visualização precisa fornecer pontos de extensão. Presumo que os dados para a visualização contenham essas partes do módulo e são escolhidos pelo controlador de alguma forma:

public ActionResult Search(string text)
{
   var model = seachService.Search(text)
   // here either:
   // 1. model contains .Modules collection and is populated by the service, or
   // 2. controller does
   var viewmodel = new SearchViewModel(model, modulesService.GetModulesFor(model));
   // i.e. it adds modules-specific information to the view data
   return View(model);
}

Agora, os dados específicos dos módulos são convertidos pela SearchViewModel em algo que a visualização pode usar:

public interface IModuleSpecificViewPart
{
  public IList<string> GetAdditionalLinksForUser();
  public void RenderAdditionalInfo(Response response);
}

E sua visão faz

<%= Model.Results[i] %>
<% foreach (var module in Model.ModuleSpecific) { %> 
<a href="<%=module.AdditionalLink%>">More</a> 
<% module.RenderAdditionalInfo(Response); %>
<% } %>

Ou o modelo de visualização do módulo pode fornecer nome de visualização parcial, etc. Observe que ele é modules.getModulesfor () e SearchViewModel que fazem o trabalho - por exemplo, o SearchViewModel pode fazer ioc.getInstanceByType ("ModuleViewModel" + PASSEDMODULE.GETTYPE (). Nome) - Recolher automaticamente a classe Modelo de exibição específica do módulo.

Esta é a ideia. Pode ser que eu entendo sua pergunta completamente errada - desculpe se sim.

Um conselho, eu pessoalmente descobri que, se eu tentar ser muito genérico, ele adiciona complicações desnecessárias ao projeto (eu até mesmo escreveu sobre isso). Ou seja, seus módulos são desconhecidos na hora da compilação, mas você precisa saber algo sobre eles! Eles podem adicionar link para o resultado da pesquisa - aqui está o ponto de extensão para isso. Não se pode fazer pontos de extensão de imagens para "qualquer coisa", então primeiro você precisará listar seus casos específicos.

Outras dicas

Acho que a resposta do Queen3 é mais adequada ao seu problema específico, mas pensei em postar minhas idéias sobre o assunto geral de qualquer maneira.

Estou pensando em fazer algo semelhante usando as técnicas discutidas em Matthew Abbott's blogpost. Usando o MEF, você pode simplesmente soltar uma nova DLL em seu portal para ativar um módulo.

Ter vários módulos em uma única página é um pouco mais complicado. RenderPartial Pode funcionar, mas isso geralmente é para adicionar código que funciona com o mesmo modelo de visualização. RenderAction Por outro lado, usa seu próprio controlador e modelo. Eu geralmente não favoreceria usar RenderAction Em qualquer outro cenário, porque quebra ou pelo menos engana o padrão MVC. Nesse caso, no entanto, ele seria usado apenas em uma única página responsável por estabelecer vários módulos. Todos os seus plugins podem ser visualizações, controladores e modelos regulares de MVC.

Detalhes sobre RenderAction pode ser encontrado aqui.

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