1

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

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

而不是像下面这样的 URL:

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

MVC URL 往往像这样工作:|url|/|controller|/|action|/|params|

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

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

4

3 回答 3

3

根据您的默认参数,您可以创建路由约束

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

如果您有很多控制器,您可能应该真正研究如何为您所期望的创建约束。

于 2012-08-26T13:15:46.340 回答
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 建议的方法来创建它们。查看Scott Gu 的博客本教程

于 2012-08-26T12:59:47.387 回答
1

在 IIS 7 中,您需要查看处理程序映射。您可以指定一个特定的扩展名,例如 *.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 的最新版本,可能会有令人讨厌的语法变化,因此请注意这些变化。

于 2012-08-26T13:06:25.267 回答