【问题标题】:ASP.Net Routing in asp.net web-formsASP.Net 网络表单中的 ASP.Net 路由
【发布时间】:2014-02-05 13:31:58
【问题描述】:

我正在为我的网站使用 ASP.Net 网络表单路由,但我想让它更具结构性并隐藏所有具有正确结构的查询字符串 ID,例如 Language/Category/PageName-Title 例如:www.abc.com/en/sports/cricket-world-cup

但是以我目前的路由技术,我可以让它像

www.abc.com/en/1/13/cricket-world-cup

domain/english-folder/language-id/page-id/page-title

我怎样才能使它更结构化为`www.abc.com/en/sports/cricket-world-cup

由于我的查询字符串很少,所以我这样设计它

    //For Page.aspx
    routes.MapPageRoute("Page_Route", "en/page/{LID}/{PID}/{PageName}", "~/en/Page.aspx", false,
                new RouteValueDictionary {
                    { "LID", "0"},
                    { "PID", "0" },
                    { "PageName", "Page-not-found" }},
                new RouteValueDictionary {   
                    { "LID", "[0-9]{1,8}" },
                    { "PID", "[0-9]{1,8}" },
                });

上述路由的结果让我得到这样的友好 URL
www.abc.com/en/1/13/cricket-world-cup

但我想像示例中的那样进一步构建 URL。

www.abc.com/en/sports/cricket-world-cup

示例:我发现的这个网址更结构化/ http://www.thenational.ae/news/world/europe/turkey-providing-jobs-a-future-for-more-greeks

如果他们将querystrings 作为隐藏字段传递,我如何实现相同的结构。请建议此类网址的最佳方法。

另一个例子是http://mashreqbank.com/uae/en/corporate/lending/trade-finance.aspx

他们正在使用 asp.net,但我不确定它是 ASP.Net MVC 还是 ASP.Net webform。

我已经为这种路由苦苦挣扎了很长时间,甚至我找不到一个可以考虑多个查询字符串的完整示例,因为大多数示例都基于一个查询字符串。

非常感谢编码专家提供的示例帮助。

更新: 让我们考虑这个表,我用它来存储页面名称、标题、处理程序、语言区域等。这只是一个演示表,与我为示例结构化 url 引用的实际网站并不相似。我什至不确定他们是否使用 URL 路由进行操作,或者这些是实际的物理文件夹和文件,例如旧式网站,您可以在其中创建实际文件夹并将文件放置在其等中。

Page_ID     Page_Name               Page_Title              Page_Handler        Parent_Page_ID  Language_ID     Region_ID
1           Home                    Home                    index.aspx              0               1               uae
2           Personal                Personal                index.aspx              0               1               uae
3           Accounts & Deposits     Accounts & Deposits     index.aspx              2               1               uae
4           Current Account         Current Account         current-account.aspx    3               1               uae
5           Current Gold Accounts   gold Account            gold-account.aspx       3               1               uae
6           Easy Saver              Easy Saver Account      saver-account.aspx      3               1               uae
7           Fixed Deposits          Fixed Account           fixed-account.aspx      3               1               uae
8           Loans                   Loans                   index.aspx              2               1               uae
9           Personal Loans          Personal Loans          index.aspx              8               1               uae
10          car Loans               car Loans               car-loan.aspx           8               1               uae

上述结构的网站示例http://mashreqbank.com/

如果页面设计相同,我们可以使用通用页面处理程序这是我假设让我们说page.aspx

请感觉对结构和数据进行更改以达到预期的结果。

【问题讨论】:

    标签: c# asp.net webforms


    【解决方案1】:

    你可以简单地有这样的东西:

    routes.MapPageRoute(
        "article-route",
        "en/{category}/{pageName}",
        "~/en/page.aspx");
    

    然后在en/page.aspx 上,您可以访问类别和页面名称,假设您有一个查询要根据这两个变量找到正确的文章:

    string category = Page.RouteData.Values["category"] as string;
    string pageName = Page.RouteData.Values["pageName"] as string;
    

    但是,如果您不能仅通过 categorypageName 识别页面(根据您更新的问题,这似乎是正确的),您可能需要在路由中使用 id。在这种情况下,您可以忽略 categorypageName 路由值,因为它们只是为了美观的 URL。我们关心的唯一参数是id,因为这是您识别文章的方式。例如,这里是各种路线的三个示例

    routes.MapPageRoute(
        "uae-route",
        "uae/en/{category}/{id}/{pageName}",
        "~/en/index.aspx");
    
    routes.MapPageRoute(
        "gbr-route",
        "gbr/en/{category}/{id}/{pageName}",
        "~/en/index.aspx");
    
    routes.MapPageRoute(
        "account-route",
        "en/{id}/{pageName}",
        "~/en/current-account.aspx");
    
    //then on en/index.aspx and current-account.aspx
    int pageId= 0;
    if (Int32.TryParse(Page.RouteData.Values["id"] as string, out pageId)) {
        // get the page details (including parent page id and language id if needed)
        // where Page_ID=pageId. 
    }
    

    不过,从它的声音来看,您想要执行上面的第一个示例,这意味着您需要一种方法来简单地通过 categorypageName 而不是任何类型的 id 来提取文章。

    更新:您不需要为每条路径创建一个路由......这就是路由的全部意义所在。如果您有多个处理程序,那么您至少需要每个处理程序的路径(.aspx 页)。

    在 URL 中使用id 是最简单的方法,因为根据您的数据结构,这是识别您要拉取的页面的唯一方法。因此,让我们使用您的示例,使用这些路线:

    www.abc.com/en/personal

    www.abc.com/en/personal/acounts-deposits/

    www.abc.com/en/personal/acounts-deposits/current-account

    www.abc.com/en/personal/acounts-deposits/current-gold-account

    www.abc.com/en/personal/acounts-deposits/easy-saver

    你只有一条路线:

    routes.MapPageRoute(
        "personal_route",
        "en/personal/{category}/{pageName}",
        "~/personal.aspx",
        false,
        new RouteValueDictionary { { "category", string.Empty }, {"pageName", string.Empty}}); //allow for no values
    

    personal.aspx 的代码如下:

    protected void Page_Load(object sender, EventArgs e)
    {
        string category = Page.RouteData.Values["category"] as string;
        string pageName = Page.RouteData.Values["pageName"] as string;
        if (String.IsNullOrEmpty(category)) {
            //no category... must be the /personal route. handle that    
        }
        else if (String.IsNullOrEmpty(pageName))  {
            //no page name, just load the category page content
            //Psuedo query against your non-existant data schema
            //SELECT * FROM SiteContent WHERE Page_Handler='Personal' AND Page_Category=category && Page_URL=""
        }
        else {
            //SELECT * FROM SiteContent WHERE Page_Handler='Personal' AND Page_Category=category && Page_URL=pageName
        }
    }
    

    如您所见,您的问题是您无法识别没有 ID 的页面。您需要将表中的所有这些 ID 替换为唯一的 URL。这是可行的。

    【讨论】:

    • 感谢您的回复,如果我必须在 url 中显示页面层次结构,如 Parent_Page/Child_Page/Title 我的意思是页面可以向下 1,2 或 3 级,例如此 url http://mashreqbank.com/uae/en/corporate/lending/project-finance.aspx
    • 应该没有什么不同。您可以设置多个路由,这些路由都使用相同的参数和不同的路由 url 路由到同一个地方。我已经为不同的新闻 url 做到了这一点,但最后它们都由同一个 aspx 文件处理。是这个意思吗?
    • 我已经用示例数据库更新了我的问题...以提供更清晰的结构.. 请忽略处理程序文件,因为其中大部分是 index.aspx 我可以使用不同的或一个处理程序文件如果每个部分的页面设计不同,则每个部分的页面设计都不同,否则我几乎可以对几乎所有页面使用一个文件Page.aspx...请建议是否需要更改任何内容或我应该采取什么方法来获得所需的路由..感谢您回应。
    • @KnowledgeSeeker 在回答中添加了更多详细信息。希望这会有所帮助。
    • @KnowledgeSeeker 如果您想在没有{id} 的情况下进行路由,那么您需要一种仅基于 URL 查找页面的方法,根据您的表结构,您不能(查看按类别和页面名称,就像我在答案的第一部分中显示的变量一样)。你必须先解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多