Asp.net mvc 堆栈溢出问题路由

Asp.net mvc 堆栈溢出问题路由,asp.net-mvc,routes,Asp.net Mvc,Routes,如果查看SO问题URL,您将看到ID和“SLUG”被传递到问题控制器:。我发现有趣的是,您可以更改URL的“SLUG”部分,而不影响应用程序路由请求的能力。我认为实现这一点的唯一方法是拥有一个接受id和“SLUG”的路由,并对SLUG使用路由约束,以确保它遵循一种模式。我必须使用一个约束来确保这两个变量不会导致该路由匹配所有请求。是否有人有更好的方法来实现这一点,或者有更高级路由方案的例子 补充: 我意识到SLUG是为了人类可读性,我想在另一个应用程序中复制这个特性。实现这一目标的最佳方式是什么

如果查看SO问题URL,您将看到ID和“SLUG”被传递到问题控制器:。我发现有趣的是,您可以更改URL的“SLUG”部分,而不影响应用程序路由请求的能力。我认为实现这一点的唯一方法是拥有一个接受id和“SLUG”的路由,并对SLUG使用路由约束,以确保它遵循一种模式。我必须使用一个约束来确保这两个变量不会导致该路由匹配所有请求。是否有人有更好的方法来实现这一点,或者有更高级路由方案的例子

补充: 我意识到SLUG是为了人类可读性,我想在另一个应用程序中复制这个特性。实现这一目标的最佳方式是什么

路线: 简单约束:
你根本不需要用子弹。它可能只是为了人类可读性和搜索引擎优化。您可以在路由时忽略它,只需查找ID即可

例如,单击此处:

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


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

slug用于搜索引擎对资源/页面进行编目。在路由中根本不使用它作为传递到数据库以检索请求的post的参数的一部分

ID是最重要的部分

因此,在代码中,SlugConstraint不是必需的,而slug参数的值在Details操作中被忽略


这个行为就是这样做的,如果你想复制它,你可以做什么。

你能举个例子说明路由条目的结构吗?routes.Add(routes.MEMBERS_PROFILE.Text(),new route(“MEMBERS/PROFILE/{userid}/{userfullname}”,new PVRouteHandler(“/member/PROFILE.aspx”);我意识到slug不是必需的,我想知道如何获得相同的功能(搜索引擎)。。。这个公认的答案让我找到了一个处理这种随身携带数据的解决方案。slug对于创建规范的URL非常重要。要么你用鼻涕虫,要么根本不用。我想现在这是隐含的,与手头的问题/答案无关(我也不同意你)同意不同意。此人询问如何实现基于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("-");
    }
}