如何在ASP.NET MVC中构建多视图门户应用程序

时间:2009-10-20 21:01:57

标签: asp.net-mvc architecture structure

我正在观看Scott Hanselman在旧金山的ASP.NET MVC上的演讲。在考虑了一段时间之后,我很难过如何最好地构建基于ASP.NET MVC的站点,该站点具有[portal | modular | multi-view]结构(选择您喜欢的定义)。

为了让您了解我的目标,我的公司为外部客户构建了许多门户式应用程序,这些应用程序包含一个映射模块,可以响应它自己的查询字符串和路由,类似的税务包裹信息模块有自己的视图,文档检索视图,显示单个和多个文档......你明白了。关键部分是每个模块都是独立的。如果用户按名称搜索税务记录,他们可能会看到10个结果(“JOHN DOE”拥有一些属性)。每个结果都有一个“Map it”链接,因为网站应用程序框架知道有一个可用的地图模块。 “Map it”链接会发送正确的请求,例如http://myapp.com/taxparcel/map/123443。地图模块控制器通过缩放到地图并突出显示税单来响应外部请求。

整个流程的关键是两者税务和地图模块位于同一网页上。

那么它如何适应ASP.NET MVC框?谐音?子视图?单个控制器的多个视图?如果我只是错过了文档的明显部分,那么请随意公开抨击我并加入链接。否则,我愿意接受建议。

2 个答案:

答案 0 :(得分:2)

嗯,您的视图模型需要提供扩展点。我假设视图的数据确实包含那些模块部分,并由控制器以某种方式选择:

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

现在,SearchViewModel将特定于模块的数据转换为View可以使用的内容:

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

并且您的观点确实

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

或模块视图模型可以提供部分视图名称等。请注意,它是执行作业的模块.GetModulesFor()和SearchViewModel - 例如,SearchViewModel可以执行IoC.GetInstanceByType(“ModuleViewModel”+ passedModule.GetType())。名称) - 自动获取特定的模块视图模型类。

这是个主意。可能我理解你的问题完全错了 - 对不起,如果是这样的话。

一个建议,我个人发现,如果我试图过于通用,它会给项目增加不必要的复杂性(我甚至wrote关于它)。即是的,您的模块在编译时是未知的,但您必须了解它们!他们可能会添加搜索结果的链接 - 这是扩展点。人们不能为“任何事物”图像扩展点,所以首先你需要列出你的具体案例。

答案 1 :(得分:0)

我认为queen3的回复更适合您的具体问题,但我认为无论如何我都会在一般事项上发表我的想法。

我正在考虑使用Matthew Abbottblogpost中讨论的技术做类似的事情。使用MEF,您只需将新dll放入门户即可激活模块。

在一个页面上拥有多个模块是一个小问题。 RenderPartial可以正常工作,但这通常意味着添加适用于同一视图模型的代码。另一方面,RenderAction使用自己的控制器和模型。我通常不赞成在任何其他场景中使用RenderAction,因为它会破坏或至少使MVC模式卷入其中。但是,在这种情况下,它只能在一个负责布局多个模块的页面上使用。您的所有插件都可以是常规的MVC视图,控制器和模型。

RenderAction的详细信息可以找到here