3

如果您查看 SO 问题 URL,您会看到 ID 和“SLUG”被传递给 Questions 控制器:https ://stackoverflow.com/questions/676934/what-do-you-need-to-write-your -自己的博客引擎。我发现有趣的是,您可以更改 URL 的“SLUG”部分,而不会影响应用程序路由请求示例的能力。我能想到的唯一方法是有一个接受 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("-");
    }
}
4

3 回答 3

8

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

例如,点击这里:

堆栈溢出问题路由

于 2009-03-24T12:30:31.870 回答
1

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

ID是重要的部分。

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

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

于 2009-03-24T12:38:49.480 回答
0

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

所以ID(在你的例子中)是关键,其余的(slug)只是为了人类可读性和搜索引擎优化。

于 2009-03-24T12:34:37.900 回答