[英]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;
但是,如果您不能仅通过category
和pageName
来识别页面(对于您的更新问题来说似乎是正确的),则可能需要该路线中的id
。 在这种情况下,您可以忽略category
和pageName
路由值,因为它们仅用于美观的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
,您想做上面的第一个示例,这意味着您将需要一种仅通过category
和pageName
而不是任何类型的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.