C# ASP.Net web窗体中的ASP.Net路由
我正在为我的网站使用ASP.Net web表单路由,但我想使其更具结构,并使用适当的结构隐藏所有查询字符串ID,如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 因为我
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}" },
});
上述路由的结果为我提供如下友好URLwww.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级,例如此urlhttp://mashreqbank.com/uae/en/corporate/lending/project-finance.aspx
不应该有任何不同。您可以设置多个路由,这些路由都使用相同的参数和不同的路由URL路由到同一个位置。我已经为不同的新闻URL做了这些,但最终它们都由相同的aspx文件处理。这就是你的意思吗?我用一个样本数据库更新了我的问题。。。给一个更清晰的结构。。请忽略处理程序文件,因为它大部分都是index.aspx
如果每个部分的页面设计不同,我可以为每个部分使用不同的或一个处理程序文件,否则我可以为几乎所有页面使用一个文件page.aspx
。。。如果需要更改,请提出建议,或者我应该采取什么方法来获得所需的路线。。感谢您的回答。@KnowledgeSeek在回答中添加了更多细节。希望这能有所帮助。@KnowledgeSeek如果你想在没有{id}
的情况下进行路由,那么你需要一种简单地根据URL查找页面的方法,而根据你的表结构,你不能(按类别和页面名查找,就像我在答案的第一部分中显示的变量一样)。你得先把它修好。