【问题标题】:Asp.net MVC url rewrite action and id with nameAsp.net MVC url 重写操作和带有名称的 id
【发布时间】:2014-10-02 09:10:53
【问题描述】:

Asp.net Mvc Url MapRoute 不识别没有 Action 的 rout:

错误:在控制器上找不到公共操作方法

routes.MapRoute(
             "WorldWithoutAction",
             "World/{id}/{name}",
             new { id = UrlParameter.Optional, name = UrlParameter.Optional },
             new[] { "MyProject.Web.Controllers" });

虽然尝试这个来捕捉 World/Details 但发生了同样的错误:

routes.MapRoute(
            name: "World",
            url: "World",
            defaults: new { controller = "World", action = "Details" }
        );

我应该怎么做才能将http://domain.com/world/1/australia 捕获到http://domain.com/world/details/1? 似乎它只是接受操作而不是 url 中的 {id}。

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
             "Default",
             "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id = UrlParameter.Optional },
             new[] { "MyProject.Web.Controllers" });

        routes.MapRoute(
             "Default2",
             "{controller}/{action}/{id}/{name}",
             new { controller = "Agency", action = "Show", id = UrlParameter.Optional, name = UrlParameter.Optional },
             new[] { "MyProject.Web.Controllers" });

        routes.MapRoute(
             "Default3",
             "{controller}/{action}/{id}/{name}",
             new { id = UrlParameter.Optional, name = UrlParameter.Optional },
             new[] { "MyProject.Web.Controllers" });

        routes.MapRoute(
             "WorldWithoutAction",
             "World/{id}/{name}",
             new { id = UrlParameter.Optional, name = UrlParameter.Optional, action = "Details" },
             new[] { "MyProject.Web.Controllers" });

        routes.MapRoute(
            name: "World",
            url: "World",
            defaults: new { controller = "World", action = "Details" }
        );

    }

【问题讨论】:

  • 在第一种情况下,您需要为与控制器操作方法的名称匹配的操作添加一个默认值。在第二个中,您是否有一个名为 WorldController 的控制器和一个名为 Details 的方法?
  • 是的,我有 WorldController 和 Details(int id)
  • 您是否尝试过在第一种情况下添加像new { id = UrlParameter.Optional, name = UrlParameter.Optional, action = "Details" }, 这样的默认操作?
  • 在控制器上找不到公共操作方法“1”。在添加第一个案例之后。
  • 是在这些路由之前定义的默认路由吗?因为看起来默认的{controller}/{action}/{id} 路由正在被使用?

标签: asp.net asp.net-mvc url-rewriting


【解决方案1】:

您需要重新排序路线,以便首先定义最具体的路线。您还需要为以下各项提供默认值:

  • controlleraction 当它们没有出现在路线中时
  • 操作方法所需的任何其他参数。 (例如在方法中Details(int id) id 是必需的,因此在您的路线中您需要添加一个段{id} 或默认值)

此外,您的默认路由不能很好地相互配合,您可能需要重新考虑/简化它们。例如,您可以在 default2 中将控制器硬编码为“Agency”,并将 default 和 default3 组合在一起。

通过所有这些更改,您的路线定义将如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "World",
        url: "World",
        defaults: new { controller = "World", action = "Details", id = 0 }
    );

    routes.MapRoute(
        "WorldWithoutAction",
        "World/{id}/{name}",
        new { controller = "World", action = "Details", id = 0, name = UrlParameter.Optional },
        new[] { "MyProject.Web.Controllers" }
    );

    routes.MapRoute(
        "DefaultAgency",
        "Agency/{action}/{id}/{name}",
        new { controller = "Agency", action = "Show", id = UrlParameter.Optional, name = UrlParameter.Optional },
        new[] { "MyProject.Web.Controllers" }
    );

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}/{name}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional },
        new[] { "MyProject.Web.Controllers" }
    );
}

正如聊天中所讨论的,对于需要有效 id 来检索数据的控制器操作,将 id 声明为可选可能没有意义。您可能需要找到另一种解决方案来获得对 SEO 友好的网址。

【讨论】:

  • 实际上“URL 是按顺序与路由匹配的——第一个匹配获胜”
猜你喜欢
  • 2011-05-29
  • 2010-09-07
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2016-12-09
  • 2011-12-19
相关资源
最近更新 更多