Lea*_*ing 3 c# asp.net webforms url-rewriting url-routing
假设我的层次结构urls或friendly url's如下所示,并且由于与它们相关联的不同设计或形式,一些页面具有不同的页面处理程序
www.abc.com/personal
www.abc.com/personal/acounts-deposits
www.abc.com/personal/acounts-deposits/current-account
www.abc.com/personal/acounts-deposits/current-gold-account
www.abc.com/personal/acounts-deposits/easy-saver-ac
www.abc.com/personal/acounts-deposits/fixed-account
www.abc.com/loans
www.abc.com/loans/personal-loans
www.abc.com/loans/car-loans
Run Code Online (Sandbox Code Playgroud)
我的数据库结构包含样本数据如下所示
Page_ID Page_Name Page_url Page_Handler Parent_Page_ID
1 Home home index.aspx 0
2 Personal personal Personal.aspx 0
3 Accounts & Deposits personal/acounts-deposit Personal.aspx 2
4 Current Account personal/acounts-deposit/current-account Personal.aspx 3
5 Current Gold Accounts personal/acounts-deposit/gold-account gold-account.aspx 3
6 Easy Saver personal/acounts-deposit/easy-saaver-ac Personal.aspx 3
7 Fixed Deposits personal/acounts-deposit/fixed-account fixed-account.aspx 3
8 Loans loans loans.aspx 0
9 Personal Loans loans/personal-loans loans.aspx 8
10 car Loans car-loans car-loan.aspx 8
Run Code Online (Sandbox Code Playgroud)
在我,Menu_Table我可以识别页面,Page_url因为它是独一无二的.
routes.MapPageRoute("Personal_Route", "en/{*path}", "~/en/personal.aspx", false,
new RouteValueDictionary {
{ "path", "Page-not-found" },{ "PageName", "Page-not-found" }
});
routes.MapPageRoute("Personal_Route2", "en/{*path}", "~/en/gold-account.aspx", false,
new RouteValueDictionary {
{ "path", "Page-not-found" },{ "PageName", "Page-not-found" }
});
routes.MapPageRoute("Personal_Route2", "en/{*path}", "~/en/fixed-account.aspx", false,
new RouteValueDictionary {
{ "path", "Page-not-found" },{ "PageName", "Page-not-found" }
});
Run Code Online (Sandbox Code Playgroud)
上面的路由代码personal.aspx默认使用第一个路由作为所有URL的处理程序
我已经尝试了相当一段时间,但我无法做到正确,我会感谢这方面的帮助,以便每个页面由它正确的页面处理程序处理基于 Page_url
我想通过页面处理程序将页面作为处理程序,如下所示
www.abc.com/personal ---- (Personal.aspx)
www.abc.com/personal/acounts-deposits -----(Personal.aspx)
www.abc.com/personal/acounts-deposits/current-account -----(Personal.aspx)
www.abc.com/personal/acounts-deposits/current-gold-account ----- (gold-account.aspx)
www.abc.com/personal/acounts-deposits/easy-saver-ac -----(Personal.aspx)
www.abc.com/personal/acounts-deposits/fixed-account ----- (fixed-account.aspx(
www.abc.com/loans ----- (loans.aspx)
www.abc.com/loans/personal-loans ----- (loans.aspx)
www.abc.com/loans/car-loans ----- (car-loan.aspx)
Run Code Online (Sandbox Code Playgroud)
我不确定你的方法是否正确.让我解释一下:
在您的情况下,您使用相同的配置映射您的路径
routes.MapPageRoute("Personal_Route", "en/{*path}"
routes.MapPageRoute("Personal_Route2", "en/{*path}"
Run Code Online (Sandbox Code Playgroud)
等等.
这些路线中的每一条都将绝对匹配您的申请的所有请求
要实现目标,最好以这种方式进行映射:
//Take care to the sequensce of routes becuase if you will use route
//"personal" before route "account" and you will receive a request to
//"http://domain.com/personal/somethinghere route account will match
//"en/personl/ and will proceed to redirect to "personal" destination
routes.MapPageRoute("account", "en/personal/{q}/" ...........
routes.MapPageRoute("personal", "en/personal" ............
//Same as above
routes.MapPageRoute("loancar", "en/loan/{q}" .........
routes.MapPageRoute("loan", "en/loan"
Run Code Online (Sandbox Code Playgroud)
现在,当您正确创建和选择路线时,您可以通过简单的方式访问参数,并选择适合特定情况的操作,例如:
protected void Page_Load(object sender, EventArgs e)
{
if (Page.RouteData.Values.ContainsKey("q"))
{
if (Page.RouteData.Values["q"] !=null)
{
string p = (string)Page.RouteData.Values["q"];
switch (p)
{
case "a":
//do something
case "b":
//do something
case "c":
// Do Something
break;
case "d":
// Do Something
break;
default:
// Do Something
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您必须对数据库进行一些小的更改,您只需在网址的最后一页填写它.
请注意如何映射它是非常重要的.....我已经向您展示了一个简单的例子,只有"静态路由"(个人)和动态路由只有一个名为path的参数.有很多方法可以通过更好的粒度来实现您的目标,这些都取决于您的需求.我希望它对您有所帮助.
更新: 您不必创建所有路线,您只需要创建您需要的顶级路线,然后您需要为每个部分创建或新页面或使用multiwiex控制器在多个部分中拆分页面,以便显示例如,如果您有用于显示页面的2/3/4部分的个人页面,则可以使用取决于{q}参数的多视图控件,然后使用此处的开关案例:
switch (p)
{
case "a":
//do something
multiview.ActiveViewIndex=0
case "b":
//do something
multiview.ActiveViewIndex=1
case "c":
// Do Something
multiview.ActiveViewIndex=2
break;
case "d":
// Do Something
multiview.ActiveViewIndex=3
break;
default:
multiview.ActiveViewIndex=4
break;
}
Run Code Online (Sandbox Code Playgroud)
这是一种简单的方法.
在这种情况下,例如路线"PersonalRoute"暴露模式个人/账户存款可以用于这个特殊情况,如果你需要重定向到一个特定的情况.现在的问题是,我不知道你的业务逻辑是什么我不知道你的dal配置,所以我无法让你找到一个确切的方法.
我不知道将在您的页面中执行或运行多少任务,因此我无法向您提供有关它的更多信息.
创建一条独特的路线不是一个好方法或想法.
| 归档时间: |
|
| 查看次数: |
1882 次 |
| 最近记录: |