【问题标题】:Map route asp.net mvc映射路由 asp.net mvc
【发布时间】:2013-06-30 09:30:03
【问题描述】:

我正在努力使我的网址对 seo 友好。我需要用这种结构制作网址

www.domainname.com/article123。

还有这条路线

routes.MapRoute(
        "articlename", // Route name
        "aaaa/{articleID}", // URL with parameters
         new {action="DetailsByName",controller="Article"},
        new string[] { "bssnew.Controllers" } // Parameter defaults);

它不起作用。我的路线链接如下所示

 @Html.RouteLink("aaa ","articlename", new {articleID="CentralPark",},new { @class = "item-link" })

但是当我在路由中添加控制器和动作时,它可以工作

 routes.MapRoute(
        "articlename", // Route name
        "aaaa/{controller}/{action}/{articleID}", // URL with parameters
         new {action="DetailsByName",controller="Article"},
        new string[] { "bssnew.Controllers" } // Parameter defaults);

【问题讨论】:

  • aaaa”应该是什么?
  • 只是前缀不重要,当我删除它不起作用

标签: asp.net-mvc url seo maproute


【解决方案1】:

如果您只需要一个 ID 特定路线,以下应该可以工作

routes.MapRoute(
    "articlename", // Route name
    "{articleID}", // URL with parameters
    new { action="DetailsByName",controller="Article" }, // parameter defaults 
    new[] { "bssnew.Controllers" } // controller namespaces
);

假设你有一个看起来像这样的控制器

namespace bssnew.Controllers
{
    public class Article : Controller
    {
        public ActionResult DetailsByName(string articleID)
        {
            ...
        }
    }
}

【讨论】:

  • 但是我应该把它放在默认路由上面还是下面,因为当我把它放在默认路由上时,其他路由的路由,如果我把它放在默认下它不起作用,即使我在路由链接中指定了路由名称
  • @James,我不想成为挑剔者,但评论行 // Parameter defaults 实际上应该放在前一行。最后一行是命名空间注册。 :-)
  • @user1278119,放在默认路由配置的上面,不过,因为James明确命名了路由,所以无论位置如何,你都应该可以调用@Html.RouteLinkaction方法生成James的路由。路线将按名称而不是按顺序搜索。
  • @HuseinRoncevic 我刚刚复制并粘贴了 OP 的定义,因此它看起来像是在下一行:) 更新了,所以很清楚。您需要将此路由放在默认路由之前,以便首先处理它,然后如果它不匹配,它将回退到默认值。
  • 我应该如何注册命名空间?如果我在路由链接中通过路由名称显式调用它,为什么它仅在超过默认值时才有效?好像没有;没有函数名调用??
【解决方案2】:

我是通过詹姆斯的评论回复你的。一个问题可能是您的路线如下所示:

routes.MapRoute(
    "articlename", // Route name
    "{articleID}", // URL with parameters
    new { action="DetailsByName",controller="Article" }, // parameter defaults 
    new[] { "bssnew.Controllers" } // controller namespaces
);

生成路由后(不使用命名路由),您的链接应如下所示:http://www.example.com/Article/DetailsByName?articleId=123 其中 123 是您的文章 ID。

像这样生成上述链接的条件是将其放在“默认”路由之前。另外,检查命名空间注册是否给您带来了问题。如果不需要,请先尝试删除命名空间。

这是我根据您的问题创建的快速示例。结果是,即使将命名路由置于默认路由之下,我也设法生成了正确的路由。以下是RouteConfig.cs的内容:

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "CalculationRoute", // Note that it is below the default route
            url: "{controller}/{action}/{x}/{y}", // using both controller and action
            defaults: new { controller = "Home", action = "Calculate"}
        );
    }
}

在我的 HomeController 中,我添加了以下操作:

public ActionResult Calculate(int x, int y)
{
    return Content(String.Format("x:{0} + y:{1} = {2}", x, y, (x + y)));
}

现在,这是索引视图的内容

<table>
    <thead>
        <tr>
            <th>Method used</th>
            <th>Result</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>@@Html.ActionLink("Sample link", "Calculate", "Home", new {x = 1, y = 2})</td>
            <td>@Html.ActionLink("Sample link", "Calculate", "Home", new {x = 1, y = 2})</td>
        </tr>
        <tr>
            <td>@@Html.RouteLink("Sample link", new {controller = "Home", action = "Calculate", x = 1, y = 2}, null)</td>
            <td>@Html.RouteLink("Sample link", new {controller = "Home", action = "Calculate", x = 1, y = 2}, null)</td>
        </tr>
        <tr>
            <td>@@Html.RouteLink("Sample link", "CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
            <td>@Html.RouteLink("Sample link", "CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
        </tr>
        <tr>
            <td>@@Url.RouteUrl(new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
            <td>@Url.RouteUrl(new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
        </tr>
        <tr>
            <td>@@Url.RouteUrl("CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
            <td>@Url.RouteUrl("CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
        </tr>
    </tbody>
</table>

上面的代码产生了预期的结果。例如(顺便说一句,我正在使用一些虚拟链接,因为 SO 不允许使用 localhost):

如果我从计算路由中删除 {controller}/{action},它将生成链接(带有命名路由)为http://www.example.com/1/2

总而言之,如果您打算使用命名路由来生成对 SEO 友好的 URL,请使用 {controller}/{action}/{articleId} 配置您的路由。如果不是太重要,则使用 RouteLink 生成您的路线,但不要指定路线名称。

更新: 如果你不打算在你的路由中使用 {controller}/{action} 并且只使用 {articleId},你应该将你的路由放在 Default 之前,并且在生成链接时不要使用命名路由。在我上面的示例中,它看起来像:

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

        routes.MapRoute(
            name: "", // Note that it is below the default route
            url: "{x}/{y}", // using both controller and action
            defaults: new { controller = "Home", action = "Calculate"}
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

现在,当您使用@Html.RouteLink 生成链接时,您可以这样做:

@Html.RouteLink("My Link", new {controller = "Home", action = "Calculate", x = 1, y = 2 })

这会产生类似的东西:

http://www.VirtuoZ.com/Home/Calculate?x=1&y=2

更新 2:关于您对其他路由的请求,您始终可以依赖默认路由来生成信息,但是,您不能像评论中所说的那样生成路由:

http://www.example.com/abc 用于文章,http://www.example.com/def 用于产品

问题在于路由是相同的,路由系统会选择可以满足您请求的第一条路由。可能会发生两个请求都由相同的路由提供服务。您需要区分这两条路线。因此,对于您的文章,请使用您定义的新路由,而对于需要一个参数的其他事情,您将使用默认路由。

【讨论】:

  • 非常感谢您的努力,但在您的示例中,当我从 routes.MapRoute(name: "CalculationRoute", // 请注意它位于默认路由 url 下方: "{x}/{y}", // 同时使用控制器和动作默认值:new { controller = "Home", action = "Calculate" } );像这样,当我点击第三个链接时,这个 @Html.RouteLink("Sample link", "CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2}) 我没有收到错误 404
  • 尝试从你的路由中删除命名空间配置,看看它是否有效。另外,您能否更新您的问题以显示您如何生成链接以及生成一个链接的结果?
  • 但在您的示例中没有命名空间,在您的示例中,当我从路由中删除 {controller}/{action} 时出现 404 错误,从第二条路由中删除了它
  • 如果您可以使用我们的控制器和重定向到正确操作的操作来更新您的示例?这就是我所需要的。提前致谢
  • 但我需要网址 www.something.com/abc 吗?并按名称调用它,因为我会对其他对象有类似的操作
【解决方案3】:

[使用 ASP.NET MVC 的命名路由][1]

http://dotnet.dzone.com/articles/named-routes-aspnet-mvc

【讨论】:

    【解决方案4】:

    试试这个:

    routes.MapRoute(
    "articlename", // Route name
    "", // URL with parameters
    new { action="DetailsByName",controller="Article" id="articleID"}, // parameter defaults 
    new[] { "bssnew.Controllers" } // controller namespaces
    );
    

    【讨论】:

      【解决方案5】:

      我让它像这样工作。我认为这种实现方式更简洁,更容易理解(使用参数名称且没有命名空间)。路由代码出现在默认路由上方,如下所示:

      routes.MapRoute(
        name: "BlogPost",
        url: "{postId}",
        defaults: new { action = "Index", controller = "Blog" });
      

      控制器看起来像这样:

      public class BlogController : Controller
      {
          public ActionResult Index(string postId)
          {
              ...
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-05
        • 2012-09-03
        • 2011-04-10
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多