【问题标题】:Stack Overflow Question Routing堆栈溢出问题路由
【发布时间】:2010-10-15 04:45:14
【问题描述】:

如果您查看 SO 问题 URL,您会看到 ID 和“SLUG”被传递给 Questions 控制器:https://stackoverflow.com/questions/676934/what-do-you-need-to-write-your-own-blog-engine。我发现有趣的是,您可以更改 URL 的“SLUG”部分,而不会影响应用程序路由请求 example 的能力。我能想到的唯一方法是有一个接受 id 和“SLUG”的路由,并在 slug 上使用路由约束以确保它遵循模式。我必须使用约束来确保拥有这两个变量不会导致该路由匹配所有请求。有没有人有更好的方法来完成这个,或者更高级的路由场景的例子?

补充:

我意识到 SLUG 是为了便于人类阅读,我想在另一个应用程序中复制此功能。实现这一目标的最佳方法是什么。

路线:

routes.MapRoute(
    "Id + Slug",          // Route name
    "Test/{id}/{slug}",   // URL with parameters
    new                   // Parameter defaults
    {
        controller = "Test", 
        action = "Details", 
        id = "", 
        slug = "" 
    },  
    new { slug = new SlugConstraint() }
);

简单约束:

public class SlugConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext,
        Route route,
        string parameterName,
        RouteValueDictionary values,
        RouteDirection routeDirection)
    {
        string value = values[parameterName].ToString();

        return value.Contains("-");
    }
}

【问题讨论】:

    标签: asp.net-mvc routes


    【解决方案1】:

    您根本不需要使用蛞蝓。它可能只是为了人类可读性和搜索引擎优化。您可以在路由时忽略它,只处理 ID。

    例如,点击这里:

    Stack Overflow Question Routing

    【讨论】:

    • 蛞蝓对于制作规范网址很重要。要么你使用蛞蝓,要么根本不使用它们。我想这是现​​在隐含的
    • 这与手头的问题/答案并不特别相关(我也不同意你的看法)
    • 同意不同意。该人正在询问如何基于slugs实现路由。
    【解决方案2】:

    “路由”可以是路由器可以配置处理的任何内容。然后将“路由”的动态部分传递到登录/目标页面并通过 RouteValue() 方法(在 ASP.NET 路由中)进行检索。您如何处理目标页面上的这些值完全取决于您。使用它们或忽略它们。

    因此,ID(在您的示例中)是关键,其余部分(slug)仅用于人类可读性和 SEO。

    【讨论】:

    • 你能举例说明路由条目的结构吗?
    • routes.Add(Routes.MEMBERS_PROFILE.Text(), new Route("members/profile/{userid}/{userfullname}", new PVRouteHandler("/member/profile.aspx")) );
    【解决方案3】:

    搜索引擎可以对资源/页面进行分类。它根本没有在路由中用作传递给数据库以检索请求的帖子的参数的一部分。

    ID 是重要的部分。

    因此,在您的代码中,SlugConstraint 不是必需的,并且在 Details 操作中忽略了 slug 参数的值。

    如果您希望复制 SO,此行为是 SO 所做的以及您可以做的。

    【讨论】:

    • 我意识到 slug 不是必需的,我想知道如何获得相同的功能(对于搜索引擎)......接受的答案使我找到了处理这种随身携带的解决方案数据。
    猜你喜欢
    • 2014-05-09
    • 2017-05-02
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 2020-06-19
    • 2010-10-27
    相关资源
    最近更新 更多