ASP.NET路由 - 添加路由

时间:2013-06-27 20:57:30

标签: asp.net routing webforms

应用程序启动后是否可以添加/删除路由? 我想要做的是,能够管理管理系统中的路由,而无需重新启动Web应用程序。因此,内容团队将根据他们的需求设置路由。

我们使用ASP.NET 4 WebForms应用程序。

2 个答案:

答案 0 :(得分:2)

这是可能的,但您需要编写自己的逻辑来处理路径收集和更新,基于添加/删除到集合。

下面的代码只是为了展示如何实现这样的基础知识。有许多方法可以动态存储和拥有用户更新路径。

在Global.asax中假设您有一些预定义的路线:

    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup

        RegisterRoutes(RouteTable.Routes);

    }

    void RegisterRoutes(RouteCollection routes)
    {
        routes.MapPageRoute("RouteDirect", "about/{user}", "~/about.aspx");
    }

现在About.aspx有办法读取路线值。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.RouteData.Values["user"] != null)
        {
            TextBox1.Text = Page.RouteData.Values["user"].ToString();
        }
    }

如果您浏览到localhost:51604 / about / john 你会在文本框中看到约翰。

下面是关于如何添加/删除路线的简单示例。您可以扩展此逻辑以满足您的需求,您可以在内容团队的安全页面上显示所有现有路由,并为他们提供添加/删除/禁用路由的能力,或者使用更复杂的方式来指定路由参数等。

        protected void Button1_Click(object sender, EventArgs e)
        {
            //Adding New Route on Button Click
            RouteTable.Routes.MapPageRoute("RouteDirectNew", "aboutnew/{user}", "~/about.aspx");

            //Now route table has 2 routes:
            // about/{user}
            // aboutnew/{user}
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            //Removing new route on button click
            RouteCollection rcollection = new RouteCollection();
            rcollection = RouteTable.Routes;

            Route ToDeleteRoute = null;

            foreach (Route r in rcollection)
            {
                if (r.Url == "aboutnew/{user}")
                    ToDeleteRoute = r;
            }

            if(ToDeleteRoute != null)
                RouteTable.Routes.Remove(ToDeleteRoute);

            //Now route table has only 1 route the original added via global.asax:
            // about/{user}

        }

答案 1 :(得分:0)

根据MSDN,如果要在Global.asax.cs的Application_start之外修改RouteTable.Routes,则需要获取读/写锁以确保其线程安全。

所以上面的Button2_Click应该是这样的:

    protected void Button2_Click(object sender, EventArgs e)
    {
        //Removing new route on button click
        RouteCollection rcollection = new RouteCollection();

        using (currentRoutes.GetReadLock())
        {
            rcollection = RouteTable.Routes;
        }

        Route ToDeleteRoute = null;

        foreach (Route r in rcollection)
        {
            if (r.Url == "aboutnew/{user}")
                ToDeleteRoute = r;
        }

        if(ToDeleteRoute != null)
        {
            using (currentRoutes.GetWriteLock())
            {
                RouteTable.Routes.Remove(ToDeleteRoute);
            }
        }

        //Now route table has only 1 route the original added via global.asax:
        // about/{user}

    }