我正在创建一个我希望动态添加页面的网站。因此,我希望有一个更简单的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。
答案 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 blog和this 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版本,可能会出现令人恼火的语法更改,因此请注意这些。