Мне нужно зарегистрировать динамический маршрут в файле Global.asax

Я храню данные своей страницы в таблице меню как

MenuName, MenuID, ParentID, PageURL, PageHandler 
Home, 1, 0, /,Default.aspx 
About Us, 2, 0, /about-us/, About.aspx 
Contact, 3, 0, /contact/, contact.aspx 
Mission, 4, 2, /about-us/mission/, About.aspx
Vision, 5, 2, /about-us/vision/, About.aspx

Если я кодирую свой маршрут как статический в файле Global.asax, он работает нормально, как показано ниже.

 public static void RegisterRoutes(RouteCollection routes)
 {
    routes.MapPageRoute("en_Home", "default/", "~/default.aspx", false,
            new RouteValueDictionary {
            { "path", "page-not-found" },{ "pagename", "page-not-found" }
            });

     routes.MapPageRoute("en_aboutUs", "about-us/", "~/about_us.aspx", false,
            new RouteValueDictionary {
            { "path", "page-not-found" },{ "pagename", "page-not-found" }
            });
}

Я хочу, чтобы мои маршруты были динамическими, чтобы я мог прочитать URL-адрес и значение PageHandler из базы данных и передать его в Route в файле Global.asax как

public static void RegisterRoutes(RouteCollection routes)
 {          
    string sURL = HttpContext.Current.Request.Url.AbsolutePath;
    //Above Statement give error Say "HttpContext.Current Cant be used in this context

    string PageHandler =  DataProvider.GetPageHandlerByPageURL(sURL);

     routes.MapPageRoute("en_General_Page", sURL, PageHandler, false,
            new RouteValueDictionary {
            { "path", "page-not-found" },{ "pagename", "page-not-found" }
            });     
 }

Я не получаю никакого успеха в этом, так как мне нужно передать значение HttpContext.Current.Request.Url.AbsolutePath другой функции, чтобы я мог получить обработчик страницы. Вылетает с ошибкой Cant use HttpCotext in this context

HttpContext.Current.Request.Url.AbsolutePath не работает в функции Route RegisterRoutes, я должен определить то же самое в Application_BeginRequest, но тогда у него есть своя проблема.

Как я могу добиться динамической маршрутизации в моем случае. Я использую ASP.Net Webform 4.5

Я был бы признателен за помощь в этом отношении.


person Learning    schedule 27.09.2015    source источник


Ответы (2)


Вот динамическая маршрутизация в ASP.NET Cheers :) -

public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            RegisterRoute(RouteTable.Routes);
        }

        public void RegisterRoute(RouteCollection routes)
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable("T");
            dt.Columns.Add(new DataColumn("Head", typeof(string)));
            dt.Columns.Add(new DataColumn("Desc", typeof(string)));
            dt.Columns.Add(new DataColumn("Url", typeof(string)));

            DataRow dr0 = dt.NewRow();
            dr0["Head"] = "Default";
            dr0["Desc"] = "D/D";
            dr0["Url"] = "~/Default.aspx";
            dt.Rows.Add(dr0);

            DataRow dr1 = dt.NewRow();
            dr1["Head"] = "ERP1";
            dr1["Desc"] = "ERP/ERP1";
            dr1["Url"] = "~/ERP/ERP1.aspx";
            dt.Rows.Add(dr1);

            DataRow dr2 = dt.NewRow();
            dr2["Head"] = "ERP2";
            dr2["Desc"] = "ERP/ERP2";
            dr2["Url"] = "~/ERP/ERP2.aspx";
            dt.Rows.Add(dr2);

            DataRow dr3 = dt.NewRow();
            dr3["Head"] = "W";
            dr3["Desc"] = "W/W";
            dr3["Url"] = "~/WebForm1.aspx";
            dt.Rows.Add(dr3);

            foreach (DataRow d in dt.Rows)
            {
                routes.MapPageRoute(d["Head"].ToString(), d["Desc"].ToString(), d["Url"].ToString());
            }
        }
    }
person ethiraj    schedule 20.11.2019

Вы сбиваете меня с толку;

Я с удовольствием отвечу на вопрос, просто введите URL-адреса так, как они будут отображаться в веб-браузере.

e.g.

"http://localhost/Home"

"http://localhost/about-us"

"http://localhost/about-us/mission"

"http://localhost/about-us/vision"

Похоже, вы не понимаете, как прописывать маршруты.

я потеряла нить рассуждения;

   MenuName, MenuID, ParentID, PageURL, PageHandler 
    Home, 1, 0, /,Default.aspx 
    About Us, 2, 0, /about-us/, About.aspx 
    Contact, 3, 0, /contact/, contact.aspx 
    Mission, 4, 2, /about-us/mission/, About.aspx
    Vision, 5, 2, /about-us/vision/, About.aspx

Я обновлю свой ответ, когда вы сообщите мне необходимую информацию.

Обновить

похоже, мое понимание веб-формы ASP.Net может отличаться. Почему ты не используешь

   routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

вместо ....

 routes.MapPageRoute(
     routeName: "SomeRouteName",
     routeUrl: "GuessingHardset",
     physicalFile: "~/about_us.aspx", //also hard set
     checkPhysicalUrlAccess: false
 );

Обновить

мои извинения, они разные.

Отличная ссылка: http://weblogs.asp.net/scottgu/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series< /а>

что-то вроде....

routes.MapPageRoute(
    "en_aboutUs",
    "about-us/{subpage}",
    "~/about_us.aspx",
    false
});

void Page_Load(object sender, EventArgs e)
{
    //Retrive subpage param from "about-us/{subpage}" URL
    string subpage = Page.RouteData.Values["subpage"] as string;
}
person Seabizkit    schedule 27.09.2015
comment
Это веб-форма ASp.net, которую вы мне показываете, я думаю, для MVC. Кроме того, я хочу, чтобы значение моего PhysicalFile исходило из базы данных. В вашем случае он статический. - person Learning; 28.09.2015