如何使用单一路径在asp.net webform中创建友好的URL

时间:2015-02-28 09:44:23

标签: c# asp.net webforms routing url-routing

我不确定是否可以创建完整的友好网址(Slug我认为他们称之为wordpress)。

我想用global.asax文件中定义的单一路径动态创建友好的URL。

示例:

about-us/

about-us/who-we-are/

about-us/sub-page/sub-page2/

media/news/

media/photo-gallery/

media/press/

目前我必须为所提到的每个网址定义路线。

我过去曾尝试使用gloabal.asax

中定义的单一路线创建上述路线

例如

在global.asax文件中

我调用数据库表并获取Page_Name,Page_Handler,Page_Title等信息......

//Create Route
//some logic to get url segments so that it can be passed to 
getPageDetails(PageURL)
{
//logic to get PageHandler so that route can be created
}

        //For general.aspx Page
        routes.MapPageRoute("Page", "about-us/", "~/Aboutus.aspx", false,
                        new RouteValueDictionary {
                        { "path", "Page-not-found" },{ "PageName", "Page-not-found" }
                    });

如何动态创建此路线,以便我可以通过about-us/& pageHandler动态地为一个路由函数调用所有页面的路由。如果可以,那么我可以添加尽可能多的页面到网站,并通过添加额外的路由更改global.asax路段。

请建议如何调用数据库函数来获取pagehandler并将其分配给路由以处理路由我不确定是否可行。

在wordpress中,他们创建了一个页面&友好的页面名称可以在asp.net Web表单中实现相同的目的。

带数据的样本表

Page_ID Page_Name       Page_Handler    Page_URL
1       About Us        General.aspx    /about-us/
2       Who we are      General.aspx    /about-us/who-we-are/
3       ...             ..              /about-us/sub-page/sub-page2/
4.      Media           #
5       News            news.aspx       /media/news/
6       Photo Gallery   galler.aspx     /media/photo-gallery/   

2 个答案:

答案 0 :(得分:2)

我尝试使用Application_beginRequest事件解决您的问题。下面是代码,它不是生产就绪代码[刚做同一个应用],但它的一个例子如何解决你的问题。您可能需要根据不同的方案添加更多的检查和验证。但不应该有很多问题。请阅读并告诉我:

创建了一个类

public class MaintainUrls
    {
        public int PageId { get; set; }
        public string Page_Name { get; set; }
        public string  Page_Handler { get; set; }
        public string Page_Url { get; set; }

    }

课程中的种子值

List<MaintainUrls> urls = new List<MaintainUrls>()
        {
            new MaintainUrls() { PageId = 1, Page_Name = "About Us", Page_Handler = "About.aspx", Page_Url = "/about-us"},
            new MaintainUrls() { PageId = 2, Page_Name = "About Who we were", Page_Handler = "About.aspx", Page_Url = "/about-us/who-we-are/"},
            new MaintainUrls() { PageId = 2, Page_Name = "About Who we were sub page", Page_Handler = "About.aspx", Page_Url = "/about-us/sub-page/sub-page2/"},
            new MaintainUrls() { PageId = 1, Page_Name = "About Us", Page_Handler = "Contact.aspx", Page_Url = "/contact"},
            new MaintainUrls() { PageId = 1, Page_Name = "About Us", Page_Handler = "Default.aspx", Page_Url = "/"},
        }; 

Global.asax中的Application_BeginRequest

 void Application_BeginRequest(Object sender, EventArgs e)
        {
            string path = Request.Path.ToLower();

            if (urls.Any(url=> url.Page_Url.Equals(path)))
            {
                string handler = urls.First(url => url.Page_Url.Equals(path)).Page_Handler;
                Context.RewritePath(@"~/" + handler);
            }
        }

答案 1 :(得分:0)

有一个Nuget包可以轻松添加到您的项目中:

这是一个快速教程:

正如Scott Hanselman所述,您首先要在应用程序启动时添加以下代码:

RouteConfig.RegisterRoutes(RouteTable.Routes);

如果您有一个名为AboutUs.aspx的页面,您将自动获得/ AboutUs路线。 只需添加包并致电

routes.EnableFriendlyUrls();
RouteConfig中的

(这个默认值随NuGet包一起提供),整个WebForms项目丢失了.aspx扩展名并获取了你想要的路由。