首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举ASP.NET MVC RouteTable路由URL

枚举ASP.NET MVC RouteTable路由URL
EN

Stack Overflow用户
提问于 2010-12-15 02:28:10
回答 1查看 3.5K关注 0票数 6

我正在尝试弄清楚如何在RouteTable中枚举Routes的URL。

在我的场景中,我定义了以下路由:

代码语言:javascript
复制
routes.MapRoute
  ("PadCreateNote", "create", new { controller = "Pad", action = "CreateNote" });
routes.MapRoute
  ("PadDeleteNote", "delete", new { controller = "Pad", action = "DeleteNote" });
routes.MapRoute
   ("PadUserIndex", "{username}", new { controller = "Pad", action = "Index" });

换句话说,如果我的站点是mysite.com,mysite.com/create调用PadController.CreateNote(),mysite.com/foobaris调用PadController.Index()

我还有一个强类型用户名的类:

代码语言:javascript
复制
public class Username
{
    public readonly string value;

    public Username(string name)
    {
        if (String.IsNullOrWhiteSpace(name)) 
        {
            throw new ArgumentException
                ("Is null or contains only whitespace.", "name");
        }

        //... make sure 'name' isn't a route URL off root like 'create', 'delete'

       this.value = name.Trim();
    }

    public override string ToString() 
    {
        return this.value;
    }
}

Username的构造函数中,我要检查以确保name不是已定义的路由。例如,如果调用它:

代码语言:javascript
复制
var username = new Username("create");

那么就应该抛出一个异常。我需要用什么替换//... make sure 'name' isn't a route URL off root

EN

回答 1

Stack Overflow用户

发布于 2010-12-15 03:19:40

这并不能通过阻止用户注册受保护的单词来完全解决您想要做的事情,但是有一种方法可以限制您的路由。我们的站点中有/username的url,我们使用了如下的约束。

代码语言:javascript
复制
routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" },   // Parameter defaults
                new
                {
                    controller = new FromValuesListConstraint(true, "Account", "Home", "SignIn" 
                        //...etc
                    )
                }
            );

routes.MapRoute(
                 "UserNameRouting",
                  "{id}",
                    new { controller = "Profile", action = "Index", id = "" });

您可能只需要保留一个保留字列表,或者,如果您真的希望它自动执行,您可以使用反射来获取名称空间中的控制器列表。

您可以使用此命令访问路由集合。这种方法的问题是,它要求您显式注册您希望“保护”的所有路由。我仍然坚持我的观点,你最好把保留关键字的列表存储在其他地方。

代码语言:javascript
复制
System.Web.Routing.RouteCollection routeCollection = System.Web.Routing.RouteTable.Routes;


var routes = from r in routeCollection
             let t = (System.Web.Routing.Route)r
             where t.Url.Equals(name, StringComparison.OrdinalIgnoreCase)
             select t;

bool isProtected = routes.Count() > 0;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4442766

复制
相关文章

相似问题

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