加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 枚举ASP.NET MVC RouteTable路由URL

发布时间:2020-12-16 03:53:34 所属栏目:asp.Net 来源:网络整理
导读:我正在试图弄清楚如何枚举RouteTable中的路由URL. 在我的场景中,我定义了以下路由: routes.MapRoute ("PadCreateNote","create",new { controller = "Pad",action = "CreateNote" });routes.MapRoute ("PadDeleteNote","delete",action = "DeleteNote" });r
我正在试图弄清楚如何枚举RouteTable中的路由URL.

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

routes.MapRoute
  ("PadCreateNote","create",new { controller = "Pad",action = "CreateNote" });
routes.MapRoute
  ("PadDeleteNote","delete",action = "DeleteNote" });
routes.MapRoute
   ("PadUserIndex","{username}",action = "Index" });

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

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

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的构造函数中,我想检查以确保该名称不是已定义的路由.例如,如果调用此方法:

var username = new Username("create");

然后应该抛出异常.我需要替换什么// …确保’name’不是root的路由URL?

解决方法

通过阻止用户注册受保护的单词,这并不能完全回答您想要做的事情,但有一种方法可以约束您的路线.我们在我们的网站上有/用户名网址,我们使用了这样的约束.

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",id = "" });

您可能只需要保留一个保留字列表,或者,如果您真的想要它是自动的,您可以使用反射来获取命名空间中的控制器列表.

您可以使用此访问路径集合.这种方法的问题是它要求您明确注册您想要“受保护”的所有路由.我仍然坚持我的说法,你最好还有一个存储在别处的保留关键字列表.

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读