【问题标题】:Url without controller and action没有控制器和动作的网​​址
【发布时间】:2013-06-30 15:32:30
【问题描述】:

我正在制作 asp.net mvc 应用程序,我有下一个问题。例如,我需要生成这样的 URL,www.something.com/abc,其中 abc 是产品 ID,www.something.com/def,其中 def 是公司 ID。

有人可以向我展示一些带有这样的路由链接的代码吗?

@Html.RouteLink("Sample link 1", "routeName 1", 
     new {controller = "Home", action = "action name 1", parameter="abc" })

@Html.RouteLink("Sample link 2", "routeName 2", 
     new {controller = "Home", action = "action name 2", parameter="def" })

只是为了澄清我的问题,例如:

这是路由系统

  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "aaaaa",
                url: "{id}",
                defaults: new { controller = "Home2", action = "Index2" }
            );
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "bbbb",
                url: "{id}",
                defaults: new { controller = "Home3", action = "Index2" }
            );
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

这些是路由链接

@Html.RouteLink("bbbb", "aaaaa",new { id = 555 })
@Html.RouteLink("bbbb", "bbbb", new { id = 6666666, controller="Home3"})

他们都将我重定向到同一个动作控制器 home2 和动作 Index2。

但我指定了首先使用“aaaaa”和第二个使用“bbbb”的路线

我还在第二个中指定了不同的控制器。

【问题讨论】:

  • 路由引擎如何将产品与没有控制器的公司区分开来?它不会使网址混乱吗?
  • 如果www.something.com/abc是产品,www.something.com/def是公司,那么www.something.com/ghi是什么?是产品还是公司?
  • 我想从 html.routelink 中按名称调用路由
  • VirtuoZ,这是您提出的相同问题,我像 Darin Dimitrov 一样回答了您。 stackoverflow.com/questions/17388972/map-route-asp-net-mvc/…

标签: asp.net-mvc url seo


【解决方案1】:

您不能拥有 2 个外观完全相同的网址:

被路由到 2 个不同的控制器动作。路由引擎绝对无法消除它们之间的歧义。当这种形式的请求进来时,路由引擎会按照定义的顺序评估您的路由,并匹配这个:

routes.MapRoute(
    name: "aaaaa",
    url: "{id}",
    defaults: new { controller = "Home2", action = "Index2" }
);

这就是Home2控制器被执行的原因。您应该区分生成 url 的概念(使用 Html.RouteLink 助手),您可以在其中指定路由名称和评估路由。

如果您希望能够消除这两个网址之间的歧义,则需要使用约束。例如:

routes.MapRoute(
    name: "aaaaa",
    url: "{id}",
    defaults: new { controller = "Home2", action = "Index2" },
    constraints: new { id = @"\d{1,3}" }
);

routes.MapRoute(
    name: "bbbb",
    url: "{id}",
    defaults: new { controller = "Home3", action = "Index2" },
    constraints: new { id = @"\d{4,10}" }
);

在本例中,第一个路由接受 1 到 3 位的 id,而第二个路由接受 4 到 10 位的 id。

【讨论】:

  • 但是我在@Html.RouteLink("bbbb", "bbbb", new { id = 6666666, controller="Home3"}) 中定义了路由,"bbbb" 是路由吗?
  • 是的,你在 Html.RouteLink 中定义路由。就这样。当用户单击此链接时,浏览器会向您的应用程序发送一个 GET 请求。这就是路由引擎,给定一个http://example.com/555 形式的url,应该决定调用哪个控制器操作。如您所见,此 url 中不再有路由名称。那么你认为路由引擎如何知道它应该调用Home3?让我告诉你怎么做:它不能,除非你按照我的回答中解释的那样指定约束。如果你不指定约束,路由引擎只会选择最符合逻辑的:第一个。
  • 那么解决方案是什么,或者有没有解决方案,主要原因是隐藏控制器和操作以进行 SEO 优化??
  • 使用单一路由:aaaa。应该够了。如您所知,您无法从 url(操作)中隐藏重要信息。唯一可能的解决方法是有一些限制,或者只是将操作留在您的网址中。
  • 但是当我输入 URL www.example.com 时,我如何访问控制器和操作并且它们没有出现在 URL 中?
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多