首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过方法属性进行ASP.NET MVC路由

通过方法属性进行ASP.NET MVC路由
EN

Stack Overflow用户
提问于 2009-05-21 19:50:01
回答 3查看 25.7K关注 0票数 80

StackOverflow Podcast #54中,杰夫提到他们通过处理路由的方法上面的属性在StackOverflow代码库中注册他们的URL路由。听起来是一个很好的概念( Phil Haack提出了关于路由优先级的警告)。

有人能提供一些样本来实现这一点吗?

另外,有没有使用这种路由方式的“最佳实践”?

EN

回答 3

Stack Overflow用户

发布于 2009-05-25 15:51:00

这篇文章只是为了扩展DSO的答案。

在将路由转换为属性时,我需要处理ActionName属性。所以在GetRouteParamsFromAttribute中:

代码语言:javascript
复制
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,这样我就可以将它们粘贴到参数中。

票数 3
EN

Stack Overflow用户

发布于 2010-04-29 23:41:42

我已经将这两种方法结合成了一个弗兰肯斯坦式的版本,供任何想要它的人使用。(我喜欢可选的参数表示法,但也认为它们应该是与默认/约束分开的属性,而不是全部混合在一起)。

http://github.com/djMax/AlienForce/tree/master/Utilities/Web/

票数 0
EN

Stack Overflow用户

发布于 2010-07-22 22:28:17

我需要使用AsyncController使ITCloud路由在asp.net MVC2中工作--为此,只需编辑源代码中的RouteUtility.cs类并重新编译。您必须从第98行的操作名称中去掉"Completed“

代码语言:javascript
复制
// 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中,使用熟悉的UrlRouteUrlRouteParameterDefault属性装饰XXXXCompleted ActionResult:

代码语言:javascript
复制
[UrlRoute(Path = "ActionName/{title}")]
[UrlRouteParameterDefault(Name = "title", Value = "latest-post")]
public ActionResult ActionNameCompleted(string title)
{
    ...
}

希望这对有同样问题的人有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/894779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档