0

我有一个ASP.NET MVC应用程序有以下部署要求:高级ASP.NET MVC路由方案

的URL结构必须是这样的:

http://server/app/[enterprise]/[communinty]/ {控制器}/{行动} /。 ..

我想我能做的是在MVC路由处理程序获得它之前拦截URL,删除[enterprise]/[community]部分,然后允许MVC继续处理如果原始网址未包含这两个细分受众群。

这里的原因:

申请公开多个门户向多个客户(企业),以及企业内的每个社区都有自己的用户群。这种方案也可以通过将一个应用程序实例(二进制文件,内容,web.config)物理地部署到每个[社区]目录中来实现,但出于后勤和性能的原因,我认为我们不想走这条路。所以我试图通过路由技巧来虚拟化它。

任何有关如何去实施这个计划或备用解决方案的建议将不胜感激。

我们在IIS 7上,如果这有什么区别。

+0

因此,人们访问'http:// server/app/MyCompany/FightingDogs/Home/Index',然后您想提取MyCompany/FightingDogs,以便URL现在读取'http:// server/app/Home/Index '? (我想你在会话或cookie中存储对MyCompany/Fightingdocs的引用?) – jao 2010-07-23 20:43:12

+0

不完全。我希望浏览器可见的URL保持为http:// server/app/MyCompany/FightingDogs/Home/Index,但我不希望MVC控制器/模型/等必须知道“MyCompany/FightingDogs”部分。 – jlew 2010-07-23 20:49:24

+0

不使用路由会更有意义,而是在登录时将当前用户的企业和社区存储在会话中?我可以想象,如果它们对于每个用户群都是唯一的,那么很难在文档中包含URL。 – Ryan 2010-07-24 04:07:07

回答

1

您可以使用下面的路由默认路由

routes.MapRoute(
    null, 
    "{enterprise}/{community}/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

之前,则可以忽略{企业}和{}社区参数动作方法。

+0

你知道吗,我曾经认为不可能“忽略”这些元素(视图模型需要包含它们),但看起来你是对的。谢谢! – jlew 2010-07-27 13:41:34

0

以下是使用IIS Rewrite模块的可能解决方案。这可能不是最好的方法,但它可能有效。 MVC路由中有更简单/更好的选项吗?不确定。只是自己开始做这件事。

以“http://server.com/app/enterprise/community/controller/action/”为例。

会发生什么:

  1. 条上的串出的URL。新 URL: http://server.com/controller/action/
  2. 重定向用户到新的URL。用户 浏览器现在显示: http://server.com/controller/action/
  3. 注意到新的URL,并试图重建 它抓住了正确的 内容。用户浏览器显示: http://server.com/controller/action/; IIS回报: http://server.com/app/enterprise/community/controller/action/

一旦安装了IIS重写模块所有这一切都将在web.config中:

<rewrite> 
    <rules> 
     <clear /> 

     <rule name="Redirect to remove Offending String" enabled="true" patternSyntax="Wildcard" stopProcessing="true"> 
      <match url="server.com/app/enterprise/community*" /> 
      <action type="Redirect" url="/{R:1}" /> 
      <conditions logicalGrouping="MatchAll"> 
       <add input="{SERVER_NAME}" pattern="*server.com*" /> 
      </conditions> 
     </rule> 

     <rule name="Rewrite to get Original Content" enabled="true" patternSyntax="Wildcard" stopProcessing="false"> 
      <match url="*" /> 
      <conditions logicalGrouping="MatchAll"> 
       <add input="{SERVER_NAME}" pattern="*server.com*" /> 
      </conditions> 
      <action type="Rewrite" url="app/enterprise/community{R:1}" /> 
     </rule> 

    </rules> 
</rewrite> 

注:只是做这个快速,没有测试。

+0

他使用mvc,内置了路由(如果你不知道) – jao 2010-07-23 20:44:53

+0

我意识到MVC内置了路由,但是从我认为jlew想要的内容中读取并认为MVC路由可能无法做到这一点。 但是,在阅读jlew的新评论之后,我的方法将无法满足他的需求,它直接处理MVC路由。 – mcnarya 2010-07-23 21:06:51