【问题标题】:How to create friendly url in asp.net webform with single route如何在 asp.net webform 中使用单路由创建友好的 url
【发布时间】:2015-05-01 01:33:09
【问题描述】:

我不确定是否可以创建完整的友好网址(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/

目前我必须为提到的每个 url 定义路由。

我过去曾尝试使用 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 路由部分,从而向网站添加尽可能多的页面。

请告知如何调用数据库函数来获取页面处理程序并将其分配给路由以处理路由我不确定这是否可能。

在 wordpress 中,他们创建页面和友好的页面名称,我们可以在 asp.net 网络表单中实现相同的目标。

带有数据的示例表

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/   

【问题讨论】:

  • 你真的需要 single 路由,还是只想在应用启动时动态生成路由?

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


【解决方案1】:

有一个用于此的 Nuget 包,您可以轻松地将其添加到您的项目中:

这里有一个快速教程:

正如Scott Hanselman 所提到的,您可以从在应用程序启动时添加这行代码开始:

RouteConfig.RegisterRoutes(RouteTable.Routes);

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

routes.EnableFriendlyUrls();

在 RouteConfig(此默认值与 NuGet 包一起提供)中,整个 WebForms 项目将失去其 .aspx 扩展名并获得您想要的路由。

【讨论】:

  • 示例仅显示一个一页处理程序,这可以很容易地通过 url 路由。您能否根据问题中提到的上述示例向我展示一些代码示例。
  • 我注意到在最新版本的 vs 中,如果我没记错的话,丢失的 .aspx 不是实际对象。如果所有文件都在根文件夹中,让我们说 about.aspx、contact.aspx、news.aspx、gallery.aspx 那么如果你想将新闻的路径显示为www.domain.com/about/our-mission 在这种情况下文件不是子文件夹,但它使用相同的 about.aspx 文件来服务我们任务页面的内容,但路径将以面包屑样式显示。
【解决方案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
  • 你能不能给我更多的细节,是什么对你不起作用?我们在这里拥有的是控制传入 url 并将其发送到我们希望它去的 aspx 的能力。我们可以很容易地忽略 CSS、图像。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 2013-09-03
  • 2011-03-03
  • 2010-09-18
  • 2010-09-21
  • 2014-10-17
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多