簡體   English   中英

ASP.NET Web表單中的ASP.Net路由

[英]ASP.Net Routing in asp.net web-forms

我正在為我的網站使用ASP.Net Web表單路由,但我想使其更具結構性並使用適當的結構(如Language/Category/PageName-Title示例)隱藏所有Querystring ID,例如: 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作為hiddenfields傳遞。 請為此類網址建議最佳方法。

另一個示例是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

Pleae感覺要對結構和數據進行更改,以便獲得所需的結果。

您可以簡單地擁有以下內容:

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

然后在en/page.aspx您可以訪問category和pageName,假設您有一個查詢來基於這兩個變量查找正確的文章:

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. 
}

從聲音pageName ,您想做上面的第一個示例,這意味着您將需要一種僅通過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的頁面。 您需要用唯一的URL替換表中的所有ID。 這是可行的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM