C# ASP.Net web窗体中的ASP.Net路由

C# ASP.Net web窗体中的ASP.Net路由,c#,asp.net,webforms,C#,Asp.net,Webforms,我正在为我的网站使用ASP.Net web表单路由,但我想使其更具结构,并使用适当的结构隐藏所有查询字符串ID,如Language/Category/PageName Title 示例:www.abc.com/en/sports/cricket世界杯 但是用我目前的路由技术,我可以让它像 www.abc.com/en/1/13/板球世界杯 域/英文文件夹/语言id/页面id/页面标题 我怎样才能使它更结构化为`www.abc.com/en/sports/cricket world cup 因为我

我正在为我的网站使用ASP.Net web表单路由,但我想使其更具结构,并使用适当的结构隐藏所有查询字符串ID,如
Language/Category/PageName Title
示例:
www.abc.com/en/sports/cricket世界杯

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

www.abc.com/en/1/13/板球世界杯

域/英文文件夹/语言id/页面id/页面标题

我怎样才能使它更结构化为
`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/板球世界杯

但我想进一步构造URL,如示例中所示

www.abc.com/en/sports/cricket世界杯

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

如何实现相同的结构,它们将
querystring
作为hiddenfields传递。请建议最好的方法为这样的网址

另一个例子是

他们正在使用asp.net,但我不确定它是asp.NETMVC还是asp.NETWebForm

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

任何来自编码大师的帮助都将不胜感激

更新: 让我们考虑一下我用来存储页面名称、标题、处理程序、语言区域等的这个表。。这只是一个演示表&与我参考的示例结构化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
上述结构的网站示例

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


为了达到预期的效果,请对结构和数据进行更改

您可以简单地使用以下内容:

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;
但是,如果您不能简单地通过
类别
页面名
来识别页面(根据您更新的问题,这似乎是正确的),您可能需要在路由中使用
id
。在这种情况下,您可以忽略
类别
页面名
路由值,因为它们仅用于美观的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. 
}
不过,从听起来,您希望执行上面的第一个示例,这意味着您需要一种方法,通过简单的
类别
页面名
而不是任何类型的
id
来获取文章

更新:您不需要为每个路径创建路由。。。这就是路由的全部要点。如果有多个处理程序,则至少需要每个处理程序的路径(
.aspx
page)

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

www.abc.com/en/personal

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

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

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

www.abc.com/en/personal/acounts-depositions/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。这是可行的。

谢谢你的回复。如果我必须在url中显示页面层次结构,如
父页面/子页面/标题
我的意思是页面可以向下1、2或3级,例如此url
http://mashreqbank.com/uae/en/corporate/lending/project-finance.aspx
不应该有任何不同。您可以设置多个路由,这些路由都使用相同的参数和不同的路由URL路由到同一个位置。我已经为不同的新闻URL做了这些,但最终它们都由相同的aspx文件处理。这就是你的意思吗?我用一个样本数据库更新了我的问题。。。给一个更清晰的结构。。请忽略处理程序文件,因为它大部分都是
index.aspx
如果每个部分的页面设计不同,我可以为每个部分使用不同的或一个处理程序文件,否则我可以为几乎所有页面使用一个文件
page.aspx
。。。如果需要更改,请提出建议,或者我应该采取什么方法来获得所需的路线。。感谢您的回答。@KnowledgeSeek在回答中添加了更多细节。希望这能有所帮助。@KnowledgeSeek如果你想在没有
{id}
的情况下进行路由,那么你需要一种简单地根据URL查找页面的方法,而根据你的表结构,你不能(按类别和页面名查找,就像我在答案的第一部分中显示的变量一样)。你得先把它修好。