MVC MapPageRoute 和 ActionLink

Posted

技术标签:

【中文标题】MVC MapPageRoute 和 ActionLink【英文标题】:MVC MapPageRoute and ActionLink 【发布时间】:2011-05-25 09:10:40 【问题描述】:

我创建了一个页面路由,因此我可以将我的 MVC 应用程序与我的项目中存在的一些 WebForms 页面集成:

public static void RegisterRoutes(RouteCollection routes)

    routes.IgnoreRoute("resource.axd/*pathInfo");

    // register the report routes
    routes.MapPageRoute("ReportTest",
        "reports/test",
        "~/WebForms/Test.aspx"
    );

    routes.MapRoute(
        "Default", // Route name
        "controller/action/id", // URL with parameters
        new  controller = "Home", action = "Index", id = UrlParameter.Optional  
    );

每当我在视图中使用 html.ActionLink 时,这都会产生问题:

<%: Html.ActionLink("Home", "Index", "Home") %>

当我在浏览器中加载页面时,链接显示如下:

http://localhost:12345/reports/test?action=Index&controller=Home

以前有人遇到过这种情况吗?我该如何解决这个问题?

【问题讨论】:

替代解决方案:***.com/q/10178276/11683 【参考方案1】:

我的猜测是您需要在MapPageRoute 声明中添加一些参数选项。因此,如果您在 WebForms 目录中有多个 Web 表单页面,这将很有效。

routes.MapPageRoute  ("ReportTest",
                      "reports/pagename",
                      "~/WebForms/pagename.aspx");

PS:您可能还想查看RouteCollectionRouteExistingFiles 属性

另一种方法是使用

<%=Html.RouteLink("Home","Default", new controller = "Home", action = "Index")%>

【讨论】:

谢谢。为了简洁起见,我想避免使用 RouteLink,但我最终可能不得不使用它。我只是不明白为什么当我使用 ActionLink 时页面路由会与我的常规路由匹配。【参考方案2】:

我刚刚遇到了一个非常相似的问题。我的解决方案是在查找 ActionLink 的匹配项时,给路由系统一个拒绝页面路由的理由。

具体来说,在生成的 URL 中可以看到 ActionLink 创建了两个参数:controller 和 action。我们可以使用它们作为一种方法,使我们的“标准”路由(~/controller/action/id)与页面路由不匹配。

通过将页面路由中的静态“reports”替换为我们称为“controller”的参数,然后添加“controller”必须是“reports”的约束,我们可以为报表获得相同的页面路由,但是拒绝任何带有非“报告”的控制器参数的东西。

public static void RegisterRoutes(RouteCollection routes)

    routes.IgnoreRoute("resource.axd/*pathInfo");

    // register the report routes
    // the second RouteValueDictionary sets the constraint that controller = "reports"
    routes.MapPageRoute("ReportTest",
        "controller/test",
        "~/WebForms/test.aspx",
        false,
        new RouteValueDictionary(),
        new RouteValueDictionary   "controller", "reports" );

    routes.MapRoute(
        "Default", // Route name
        "controller/action/id", // URL with parameters
        new  controller = "Home", action = "Index", id = UrlParameter.Optional  
    );

【讨论】:

以上是关于MVC MapPageRoute 和 ActionLink的主要内容,如果未能解决你的问题,请参考以下文章

IIS 7忽略没有文件扩展名的MapPageRoute

asp.net mvc中html.Action问题

ASP.NET MVC Url.Action 和路由名称值

asp mvc中action跳到另一个action怎么传递参数

请问在.net mvc3.0中,如何在action之间传递参数,切记不能在地址栏中看到

spring3 mvc 中怎么从当前action跳到另一个action中