堆栈溢出问题路由

时间:2009-03-24 12:25:34

标签: asp.net-mvc routes

如果您查看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("-");
    }
}

4 个答案:

答案 0 :(得分:8)

根本不需要使用slu ..它可能仅适用于人类可读性和搜索引擎优化。您可以在路由时忽略它,只需处理ID。

例如,请点击此处:

Stack Overflow Question Routing

答案 1 :(得分:3)

this你正在寻找什么...它没有在最后定义slu ..

答案 2 :(得分:1)

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

ID是重要的部分。

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

如果你想复制SO,这种行为就是你做的以及你能做什么。

答案 3 :(得分:0)

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

所以ID(在你的例子中)是关键,其余的(slug)就是人类的可读性和SEO。