2012-08-26 109 views
1

我正在创建一个网站,我想要动态添加页面。因此,我想要一个更简单的URL。我所瞄准的是类似下面的网址:MVC - 默认控制器

http://www.mysite.com/my-page-url 

而不是像下面这样的URL:

http://www.mysite.com/pageController/my-page-url 

MVC的网址往往是这样的工作:|url|/|controller|/|action|/|params|

我会喜欢做的是有:|url|/|params|

对于上面的URL,如果参数的值不等于控制器的名称,那么我想通过thos e参数为PageContoller.ProcessDynamicPage。

+0

我很难理解问题在这里。你可以换一下还是更简洁一些?另外,如果您已经完成了一些工作,那么您最好分享这项工作。 – Candide

+0

编辑问题 – rhughes

回答

3

根据您的默认PARAMS是什么,你可以创建一个route constraint

routes.MapRoute(
     "Default", 
     "{Param1}", 
     new { controller = "ProcessDynamicPage", action = "YourAction" }, 
     new {Param1= @"\d+" } 
    ); 

如果你的参数是一个整数,这是可行的。

如果你的默认参数是字符串或者其他东西,你不能创建一个正则表达式,或者不能实现的东西IRouteConstraint最好的办法就是为它创建一个与你的每个控制器匹配的动作,当它通过默认情况下,您已经尝试进行匹配。

routes.MapRoute(
    "YourController", 
    "YourController\{Param1}", 
    new { controller = "YourController", action = "YourAction" } 
    } 
); 

routes.MapRoute(
    "YourController2", 
    "YourController2\{Param1}", 
    new { controller = "YourController2", action = "YourAction" } 
    } 
); 

routes.MapRoute(
    "Default", 
    "{Param1}", 
    new { controller = "ProcessDynamicPage", action = "YourAction" }   
); 

如果你有很多控制器,你应该真正考虑如何创建你期待什么约束。

2

使用MVC的默认路由方案,http://www.mysite.com/my-page-url将转至my-page-url控制器中的Index操作。如果要设置默认的控制器和动作,你可以在你的Global.asax.cs做到这一点,文件,以这样的:

routes.MapRoute(
    "Default",            // Route name 
    "{action}/{pageName}",       // URL with parameters 
    new { controller = "PageContoller", action = "ProcessDynamicPage", pageName = "" } // Parameter defaults 
); 

更新

如果需要支持更多的路线你可以使用Mark Oreta建议的那种方法创建它们。看看at Scott Gu's blogthis tutorial

+0

好主意。当我添加我的答案时,恐怕我不知道新的MVC方法。 – DavidHyogo

1

在IIS 7中,您需要查看Handler映射。你可以指定一个特定的扩展名,例如* .action,由您的默认控制器处理。我现在有点生疏,但我认为它在IIS 6中基本上是相同的想法。在我的.Net 2.0应用程序的web.config文件中,我在system.webServer标记内有以下部分:

<system.webServer> 
     <handlers> 
      <add name="defaultAction" path="*.action" 
       verb="*" 
       type="SumikinIntercom.Web.Controller.Controller,SumikinIntercom.Web.Controller" 
       resourceType="Unspecified" requireAccess="None" allowPathInfo="true" /> 
     </handlers> 

因此,任何带扩展名为.action的URL都由我的默认Controller类处理。注意尴尬的语法。我必须指定完全限定的类名称(包括程序集名称),后跟逗号,然后指定完全限定的程序集名称。

对于更新的.Net版本,可能会出现令人烦恼的语法变化,所以请留意这些变化。

+0

@rhughes考虑到Zaid关于MVC特殊功能的更具体的答案,这个答案可能有点过时了,但我会留下它,因为它过去对我来说非常有用。 – DavidHyogo

+0

我明白了,谢谢 – rhughes