MVC - 默认控制器

时间:2012-08-26 12:52:18

标签: c# asp.net-mvc

我正在创建一个我希望动态添加页面的网站。因此,我希望有一个更简单的URL。我的目标是如下的URL:

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

而不是如下所示的网址:

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

MVC网址的工作方式如下:|url|/|controller|/|action|/|params|

我想做的是:|url|/|params|

对于上面的URL,如果params的值不等于控制器的名称,那么我想将这些参数传递给PageContoller.ProcessDynamicPage。

3 个答案:

答案 0 :(得分:3)

根据您的默认参数,您可以创建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" }          
);

如果你有很多控制器,你应该真正研究如何为你期望的东西创建约束。

答案 1 :(得分:2)

使用MVC的默认路由方案,http://www.mysite.com/my-page-url将转到my-page-url控制器中的索引操作。如果要设置默认控制器和操作,可以在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

答案 2 :(得分:1)

在IIS 7中,您需要查看Handler Mappings。您可以指定特定的扩展名,例如* .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版本,可能会出现令人恼火的语法更改,因此请注意这些。