在StackOverflow Podcast #54中,杰夫提到他们通过处理路由的方法上面的属性在StackOverflow代码库中注册他们的URL路由。听起来是一个很好的概念( Phil Haack提出了关于路由优先级的警告)。
有人能提供一些样本来实现这一点吗?
另外,有没有使用这种路由方式的“最佳实践”?
发布于 2009-05-25 15:51:00
这篇文章只是为了扩展DSO的答案。
在将路由转换为属性时,我需要处理ActionName属性。所以在GetRouteParamsFromAttribute中:
ActionNameAttribute anAttr = methodInfo.GetCustomAttributes(typeof(ActionNameAttribute), false)
.Cast<ActionNameAttribute>()
.SingleOrDefault();
// Add to list of routes.
routeParams.Add(new MapRouteParams()
{
RouteName = routeAttrib.Name,
Path = routeAttrib.Path,
ControllerName = controllerName,
ActionName = (anAttr != null ? anAttr.Name : methodInfo.Name),
Order = routeAttrib.Order,
Constraints = GetConstraints(methodInfo),
Defaults = GetDefaults(methodInfo),
});
此外,我发现路线的命名也不合适。该名称是使用controllerName.RouteName动态构建的。但是我的路由名称是控制器类中的常量字符串,并且我使用这些常量来调用Url.RouteUrl。这就是为什么我真的需要属性中的路由名称是路由的实际名称。
我要做的另一件事是将默认和约束属性转换为AttributeTargets.Parameter,这样我就可以将它们粘贴到参数中。
发布于 2010-04-29 23:41:42
我已经将这两种方法结合成了一个弗兰肯斯坦式的版本,供任何想要它的人使用。(我喜欢可选的参数表示法,但也认为它们应该是与默认/约束分开的属性,而不是全部混合在一起)。
http://github.com/djMax/AlienForce/tree/master/Utilities/Web/
发布于 2010-07-22 22:28:17
我需要使用AsyncController使ITCloud路由在asp.net MVC2中工作--为此,只需编辑源代码中的RouteUtility.cs类并重新编译。您必须从第98行的操作名称中去掉"Completed“
// Add to list of routes.
routeParams.Add(new MapRouteParams()
{
RouteName = String.IsNullOrEmpty(routeAttrib.Name) ? null : routeAttrib.Name,
Path = routeAttrib.Path,
ControllerName = controllerName,
ActionName = methodInfo.Name.Replace("Completed", ""),
Order = routeAttrib.Order,
Constraints = GetConstraints(methodInfo),
Defaults = GetDefaults(methodInfo),
ControllerNamespace = controllerClass.Namespace,
});
然后,在AsyncController中,使用熟悉的UrlRoute
和UrlRouteParameterDefault
属性装饰XXXXCompleted ActionResult:
[UrlRoute(Path = "ActionName/{title}")]
[UrlRouteParameterDefault(Name = "title", Value = "latest-post")]
public ActionResult ActionNameCompleted(string title)
{
...
}
希望这对有同样问题的人有所帮助。
https://stackoverflow.com/questions/894779
复制相似问题