2009-10-20 39 views
3

我只是在观看Scott Hanselman关于旧金山ASP.NET MVC的演示文稿。在思考了一段时间之后,我很难理解如何最好地构建一个基于ASP.NET MVC的站点,该站点具有[portal | modular | multi-view]结构(选择您最喜欢的定义)。如何在ASP.NET MVC中构建多视图门户应用程序

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

整个流程的关键是纳税和映射模块都在同一个网页上。

那么如何适应ASP.NET MVC框呢?谐音?子视图?单个控制器的多个视图?如果我只是遗漏了文档中明显的部分,请随时公开声明我并提供链接。否则,我很乐意提供建议。

回答

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转换成一些视图可以使用:

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

或模块的视图模型可以提供局部视图名称等请注意,这是modules.GetModulesFor()和SearchViewModel该做的乔b - 例如,SearchViewModel可以执行IoC.GetInstanceByType(“ModuleViewModel”+ passedModule.GetType()。Name) - 自动获取特定的模块视图模型类。

这是这个想法。这可能是我完全错误地理解你的问题 - 对不起,如果是的话。

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

0

我认为queen3的回复更适合您的具体问题,但我想我会在一般问题上发表我的想法。

我正在考虑使用Matthew Abbottblogpost中讨论的技术做类似的事情。使用MEF,你可以把一个新的DLL放入你的门户来激活一个模块。

在单个页面上有多个模块是有点窍门。RenderPartial可以工作,但这通常意味着添加可以在相同视图模型下工作的代码。 RenderAction另一方面使用自己的控制器和模型。我通常不会在任何其他场景中使用RenderAction,因为它会中断或至少会卷积MVC模式。但是,在这种情况下,它只能用于负责布置多个模块的单个页面。所有的插件都可以是常规的MVC视图,控制器和模型。

有关RenderAction的详细信息可查询here

+0

感谢您的补充观点。没有签出MEF是的,但了解它如何可以帮助一般。 – Dylan 2010-08-13 21:33:26

相关问题