Pregunta

Yo estaba viendo la presentación de Scott Hanselman sobre ASP.NET MVC en San Francisco. Después de pensarlo por un tiempo, yo estaba confundido en cuanto a cómo mejor enfoque construcción de un sitio basado en MVC ASP.NET que tiene una. Estructura [portal | | modular multi-view] (elija su definición favorita)

Para darle una idea de lo que busco, mi compañía acumula una gran cantidad de aplicaciones de estilo de portal para salir clientes que incorporan un módulo de mapeo que puede responder a su propias cadenas de consulta y rutas, parcela impuestos módulo de información que de igual tiene su propio punto de vista (s), documento de vista de recuperación que muestra documentos simples y múltiples ... se entiende la idea. La parte fundamental es que cada módulo es verdaderamente independiente. Si un usuario busca un récord impuesto por el nombre que podrían ver 10 resultados ( "John Doe" posee una serie de propiedades). Cada resultado tiene un enlace "Mapa que" debido a que la estructura de aplicaciones web sabe que hay un módulo de mapa disponible. El "Mapa de él" vínculo envía la solicitud de derecho como http://myapp.com/taxparcel/map/123443 . Los responde controlador del módulo de mapa a la petición externa por el zoom al mapa y destacando el paquete de impuestos.

La clave de todo esto es que el flujo de ambos los módulos fiscales y de mapeo están en la misma página web.

Entonces, ¿cómo encaja esto en el cuadro de ASP.NET MVC? Parciales? subvistas? Las vistas múltiples para un solo controlador? Si estoy solo falta la parte obvia de la documentación a continuación, no dude en fustigar públicamente e incluir el enlace. Por lo demás estoy muy abierto a sugerencias.

¿Fue útil?

Solución

Bueno, su vista del modelo necesidad de proporcionar puntos de extensión. Asumo que los datos para la vista contiene aquellas partes de módulo, y es recogido por el controlador de alguna manera:

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);
}

Ahora, los datos de los módulos específicos se convierte por SearchViewModel en algo que se puede utilizar Ver:

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

y su punto de vista hace

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

O módulo de vista de modelo puede proporcionar el nombre de vista parcial, etc. cuenta de que es modules.GetModulesFor () y SearchViewModel que hacer el trabajo - por ejemplo, SearchViewModel puede hacer IoC.GetInstanceByType ( "ModuleViewModel" + passedModule.GetType (). nombre) -. recoger automáticamente la clase módulo específico vista del modelo

Esta es la idea. Puede ser que entiendo su pregunta completamente equivocado -. Lo siento si es así

Un consejo, Yo he encontrado que si trato de ser demasiado genérico, que añade complicaciones innecesarias al proyecto (incluso escribió al respecto). Es decir. Si los módulos son desconocidos en tiempo de compilación, pero hay que saber algo acerca de ellos! Pueden añadir enlace al resultado de la búsqueda - aquí está el punto de extensión para eso. Uno no puede imágenes puntos de extensión para "nada", por lo que primero que necesita para una lista de sus casos específicos.

Otros consejos

Creo que la respuesta de queen3 es más adecuado para su problema específico, pero pensé que había puesto mis ideas sobre la cuestión general de todos modos.

Estoy pensando en hacer algo similar utilizando las técnicas descritas en Mateo Abbott 's entrada de blog . Usando MEF, puede simplemente dejar un nuevo archivo DLL en su portal para activar un módulo.

Tener varios módulos en una sola página es un poco Tricker. RenderPartial podría funcionar, pero eso es generalmente concebida para añadir código que funciona con el mismo modelo de vista. RenderAction por otra parte utiliza su propio controlador y el modelo. Yo generalmente no estaría a favor de usar RenderAction en cualquier otro escenario porque rompe o al menos convoluciona el patrón MVC. En este caso, sin embargo, sólo se puede utilizar en una sola página, que es responsable para el tendido de varios módulos. Todos los plugins podría ser regulares MVC vistas, controladores y modelos.

Detalles sobre RenderAction se puede encontrar aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top