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