Asp.net webforms路由不能正常工作
本文关键字:工作 常工作 net webforms 路由 不能 Asp | 更新日期: 2023-09-27 17:53:23
假设我的分层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
和我的数据库结构与样本数据如下所示
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
在我的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" }
});
以上路由代码总是默认使用第一个路由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)
我不确定你的方法是否正确。让我解释一下:
在你的例子中,你用相同的配置映射你的路由
routes.MapPageRoute("Personal_Route", "en/{*path}"
routes.MapPageRoute("Personal_Route2", "en/{*path}"
等等
这些路由中的每一个都将绝对匹配到对你的应用程序的所有请求
要达到你的目标,最好这样映射:
//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"
现在,当你正确地创建并选择了你的路由后,你就可以以一种简单的方式访问你的参数,并在特定情况下选择正确的操作,例如:
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;
}
}
}
}
现在,你必须对你的数据库做一些小小的改变,你将只填写你的url的最后一页。
注意如何映射非常重要.....我已经向您展示了一个简单的例子,只有"静态路由"(个人)和动态路由,只有一个参数称为路径。有很多方法可以用更好的粒度来实现您的目标,这取决于您的需求。我希望这对你有帮助。
更新:你不需要创建所有的路线,你只需要创建顶级的路线你需要你需要创建新页面每个部分或多个节使用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;
}
这是最简单的方法。
在这个例子中,路由"PersonalRoute"暴露模式personal/accounts -deposit可以用于这种特殊情况,如果你需要重定向到一个特定的情况。现在的问题是,我不知道你的业务逻辑是怎样的,我不知道你的dal配置,所以我不能给你一个确切的方法来弄清楚。
我不知道有多少任务将执行或运行在您的页面,所以我不能给你更多的信息。
创建一个独特的路由不是一个好方法或主意。
我的VS2010解决方案包含几个项目:web,业务层类,数据访问层类等。我的网络项目叫做"SystemName.WebForms"。web项目名称中的句号会干扰ASP。. NET 4.0的WebForm路由因为一些奇怪的原因。一旦我把我的项目重命名为"SystemName_WebForms",所有的路由都能正常工作。
在WEB项目名称中带句号:
只有"scenario2"answers"scenario4"有效WEB项目名称中不带句号:
所有场景都有效路线:
RouteTable.Routes.MapPageRoute("scenario1", "scenario1/{option1}", "~/About.aspx");
RouteTable.Routes.MapPageRoute("scenario2", "scenario2.aspx", "~/About.aspx");
RouteTable.Routes.MapPageRoute("scenario3", "scenario3", "~/About.aspx");
RouteTable.Routes.MapPageRoute("scenario4", "scenario4.xxx", "~/About.aspx");
也参考这个链接:http://msdn.microsoft.com/en-us/library/vstudio/dd329551 (v = vs.100) . aspx
当你在路由表中捕获请求时,你应该更具体。在当前的路由表中,您捕获了所有规则中的所有路由。这就是为什么第一个路由总是满足每个请求的url。
我认为你必须去掉路径前的*。
您可以参考以下url以获得更多说明:
http://www.prideparrot.com/blog/archive/2012/7/understanding_routing介绍