aspx.asp.net webform 路由什么时候会用到路由

【图文】WebForm与状态保持_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
WebForm与状态保持
上传于||暂无简介
大小:707.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢ASP.NET 4.0 WebForm URL路由功能
请各位帮帮忙了!!
[问题点数:40分,结帖人kittying]
ASP.NET 4.0 WebForm URL路由功能
请各位帮帮忙了!!
[问题点数:40分,结帖人kittying]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第一2007年 总版技术专家分年内排行榜第二2006年 总版技术专家分年内排行榜第二2004年 总版技术专家分年内排行榜第二
2005年 总版技术专家分年内排行榜第三2003年 总版技术专家分年内排行榜第三2002年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第一2007年 总版技术专家分年内排行榜第二2006年 总版技术专家分年内排行榜第二2004年 总版技术专家分年内排行榜第二
2005年 总版技术专家分年内排行榜第三2003年 总版技术专家分年内排行榜第三2002年 总版技术专家分年内排行榜第三
本帖子已过去太久远了,不再提供回复功能。ASP.NET WebForm 的路由 - xling - 推酷
ASP.NET WebForm 的路由 - xling
我翻了翻两前的一份邮件, 是我当时在项目之余的时间研究的,那时还没用MVC,所有项目都是 WebForm 的.
该方案我觉得可行,但是某同志一句: 不是基于底层的路径映射,效率不高, 还是 URLRewrite 好. 我笑尿了. 算鸟,都是往事. 现在想想, 这位同志还是不错的, 和另外一些人一比, 还是很伟岸的(我真心这样认为).
优化地址无非就两个选择 URLRewrite 和 MVC 里的路由(Route)
关于 URLRewrtie 和 Route 的区别,可参考:
q.com/cn/news/2008/11/urlrewriting
从 .NET 3.5 SP1 起, 微软把 MVC 路由单独抽出来,放到 System.Web.Routing 下, WebForm 程序从此可以用上路由了.
.NET 4 对路由做了改进, 使用起来很简单.. 我们的项目都是 .NET 4 的, SEO 以后肯定是要做的, 所以我试着对 Hotel.Online 做了一下路由.
现在把使用过程中的注意事项说一下.
1, Route 使URL 的层次目录改变了, 原来是 HotelInfo.aspx , 路由后,很可能是 HotelInfo/-06-21 这一小小的改变,却带来了大的影响.
A, PostBack : 原来的 Form action = “HotelInfo.aspx” , 路由后变成 action=”” 了, PostBack 当然是不对的. 要避免这个问题,请在代码里加上这句:
this.Form.Action = Page.ResolveUrl(&~/HotelInfo.aspx&);
B, script 标签的问题 : 在页面里 link 标签的地址(href)会自动转换, 但是 script 标签的地址(src)却不会自动转换, 解决这个问题,有两个办法
l A, base , &base href=”/xxx” /& 如 &base href=”/xxx” /&&script src=”main.js”&&/script& 就会自动指向 /xxx/main.js , 这个需要注意先后顺序, 如果 script 出现在 base 前, 则没有这个效果.
l 使用绝对地址. 为了简化, 和 ResourceSite 的处理方式一样, 我在 BasePage 里将 ~ 符号替换成了 http://xxx.xxx.xxxx/xxx , 所以, 只要继承 BasePage 的页面, 都可以直接写 &script src=”~/main.js”&&/script&
C, A标签的问题, 我看HTML代码里有很多 &a href=”###” onclick=”…” 的写法, 在不加 base 之前, ### 指向当前页, 但是加了 base 后, ### 就指向 base 设定的地址了. 为了避免这种情况, 应使用 href=”javascript:void()” onclick=”…” 或 href=”javascript:doSomething();” 或干脆就不用 A 标签.
2, 使用Route 后访问地址从 HotelInfo.aspx?hid=45956&ds=&de= 变成了 HotelInfo/-06-21/ , 使用 Request.QueryString 取不出 hid , ds, de 这些URL 参数了, 因为 hid, ds, de 就不是以 url 参数形式出现的. 要获取这些值, 就要使用另外一个东西: Page.RouteData.Values[key] 了, 这个 key 不区分大小写,和 QueryString 一样.
3, 脚本里的 POST / GET , 原来的页在都在同一个目录层次, 所以直接
var form = document.createElement(&FORM&);
form.action = &HotelList.aspx&;
是没有问题的, 能找到 HotelList.aspx 这个地址, 但是现在目录层次改变了, 在这样写就会找不到地址, 就如第一点的 A 里所描述的. 要解决这个问题, 要使用 base 或绝对地址.
以上是我在对 Hotel.Online 做路由遇到的问题.
下面说说使用.
1, WebApplication 或 网站要是 .NET Framework 4 (也可以用 3.5 , 但是具体有什么不同,我没有去了解, 下面的示例代码是针对 4 的)
2, 引用 System.Web.Routing 这个命名空间.
3, 在网站启动的时候,注册路由. 一般是放到 Global 的 Application_Start 里. .NET 4 里,允许用另外的方法: PreApplicationStartMethod , 这个东西我以应用到 VMaster 里, 可参考 SharedMaster.Offline. VMasterInit
4, 注册路由是通过 RouteTable.Routes. MapPageRoute 或 Add 方法. MapPageRoute 是对 Add 方法的简化操作.
RouteItemBase.cs
2 using System.Collections.G
3 using System.L
4 using System.T
5 using System.Web.R
7 namespace XXX.Frameworks.Route {
8 /// &summary&
10 /// &/summary&
11 public abstract class RouteItemBase {
13 /// &summary&
14 /// 路由名称,必须唯一
15 /// &/summary&
16 public abstract string RouteName {
20 /// &summary&
21 /// 路由地址
22 /// &/summary&
23 public abstract string RouteUrl {
27 /// &summary&
28 /// 物理地址
29 /// &/summary&
30 public abstract string PhyicalUrl {
34 /// &summary&
35 /// 路由的默认值
36 /// &/summary&
37 public abstract RouteValueDictionary Default {
41 /// &summary&
42 /// 约束
43 /// &/summary&
44 public abstract RouteValueDictionary Constraint {
48 /// &summary&
50 /// &/summary&
51 /// &param name=&routes&&&/param&
52 /// &param name=&item&&&/param&
53 public static void Map(RouteCollection routes, RouteItemBase item) {
54 routes.MapPageRoute(item.RouteName , item.RouteUrl, item.PhyicalUrl, false, item.Default, item.Constraint);
57 /// &summary&
59 /// &/summary&
60 /// &returns&&/returns&
61 public abstract object Format();
HotelInfoRoute
2 using System.Collections.G
3 using System.L
4 using System.T
5 using System.Web.R
6 using XXX.Frameworks.C
7 using XXX.Frameworks.R
9 namespace Hotel.Online.Route {
11 /// &summary&
13 /// &/summary&
14 public class HotelInfoRoute : RouteItemBase {
16 public object Hid {
21 public DateTime Ds {
26 public DateTime De {
33 #region RouteItemBase
34 public override string RouteName {
36 return RouteNames.HotelInfo.ToString();
41 public override string RouteUrl {
43 return &HotelInfo/{hid}/{ds}/{de}&;
47 public override string PhyicalUrl {
49 return &~/HotelInfo.aspx&;
53 public override RouteValueDictionary Default {
55 return new RouteValueDictionary(new {
56 Ds = DateTime.Now.AddDays(1).ToString(DateFormat.Date),
57 De = DateTime.Now.AddDays(2).ToString(DateFormat.Date)
62 public override RouteValueDictionary Constraint {
64 return new RouteValueDictionary(new {
65 Hid = @&\d+&,
66 Ds = @&\d{4}-\d{2}-\d{2}&,
67 De = @&\d{4}-\d{2}-\d{2}&
72 public override object Format() {
73 return new {
74 Hid = this.Hid,
75 Ds = this.Ds.ToString(DateFormat.Date),
76 De = this.De.ToString(DateFormat.Date)
79 #endregion
注意 HotelInfoRoute 的 RouteUrl , HotelInfo/{hid}/{ds}/{de} Hid, ds ,de 即路由的参数, 不区分大小写.
为了编程方便( 强类型 ), 我同时在这个类里定义了 Hid, Ds , De 几个属性(注意:和路由参数完全一样, 不区分大小写), 这几个属性会在页面获取 Route Url 和获取路由参数里发挥作用,会面会说.
RouteHelper.AutoLoadRoutes 是用来自动发现某个 Assembly 下所有继承自 RouteItemBase 的类, 并自动注册到当前的路由表中, 这样,就不用每加个路由,都要手动修改 Global了.
1 void Map(RouteCollection routes) {
2 routes.RouteExistingFiles = true;
3 routes.Ignore(&{resource}.axd/{*pathInfo}&);
4 routes.Ignore(&{*AllRes}&, new {
5 AllRes = @&.*?\.(?!aspx)(.*)&
8 //RouteItemBase.Map(routes, new HotelInfoRoute());
9 RouteHelper.AutoLoadRoutes(routes, typeof(HotelInfoRoute).Assembly);
12 void Application_Start(object sender, EventArgs e) {
13 Map(RouteTable.Routes);
var routeData = this.Page.RouteData.V
var HotelID = (routeData[&hid&] ?? &&).ToString().ToInt(-110),
这样写,有些隐患, 假如路由参数 {hid} 变成了 {hotelID} 了, 而你在页面里还在傻傻的用 hid , 当然是取不到值的, 怎么办呢? 用强类型可以很好的避免这个问题. 怎么用?
Page.RouteData.Values 是一个 RouteValueDictionary 类型, 继承自 IDictionary&string, object& , 我针对 IDctionary&string, object& 做了一个扩展方法.
1 public static T ToEntity&T&(this IDictionary&string, object& dict) where T : new() {
2 var t = typeof(T);
3 var ps = t.GetProperties();
4 T tmp = new T();
6 foreach (var p in ps) {
7 if (!p.CanWrite)
8 continue;
9 //var v = dict.Get(p.Name);
10 if (dict.ContainsKey(p.Name)) {
11 p.SetValue(tmp, Convert.ChangeType(dict[p.Name], p.PropertyType), null);
然后直接用:
this.RouteData = this.Page.RouteData.Values.ToEntity&HotelInfoRoute&(); 就把该页面的路由参数提取出来了
var HotelID 直接等于 RouteData.Hid 就是了.
获取路由后的地址, 被我简化成如下了,
1 public static string GetRoutedUrl&T&(T routeData)
2 where T : RouteItemBase {
3 return RouteTable.Routes.GetVirtualPath(HttpContextHelper.Current.Request.RequestContext, routeData.RouteName.ToString(), new RouteValueDictionary(
4 routeData.Format()
5 )).VirtualP
HttpContextHelper 的定义在 XXX.Frameworks.Extends.HttpContextHelper 中定义, 为什么不用 HttpContext? 因为单元测试的时候会有问题.
return RouteHelper.GetRoutedUrl&HotelInfoRoute&(new HotelInfoRoute() {
Hid = hotelID.ToString(),
Ds = this.BeginDate,
De = this.EndDate
还是强类型, 不怕改.
将以有地址重定向到新地址
HotelInfo.aspx 这个地址肯定以经被搜索引擎收录, 现在如果弃用这样的地址, 对SEO和以有用户来说, 是最不希望出现的.
如果把老地址301 到新地址,对SEO和用户不会有任何影响. 为了达到这个效果,我加了一个方法:
1 public static void RedirectToRouted(this Page page, string routeName) {
2 if (page.RouteData.Route == null) {
3 var context = HttpContextHelper.C
4 var querys = context.Request.QueryS
5 var keys = querys.Cast&string&().ToList();
7 RouteValueDictionary datas = new RouteValueDictionary();
8 keys.ForEach((k) =& {
9 datas.Add(k, querys[k]);
12 var vp = RouteTable.Routes.GetVirtualPath(context.Request.RequestContext, routeName, new RouteValueDictionary(datas));
13 context.Response.Status = &301 Moved Permanently&;
14 context.Response.RedirectLocation = vp.VirtualP
15 context.Response.End();
1 protected override void OnPreInit(EventArgs e) {
2 this.Page.RedirectToRouted( RouteNames.HotelInfo.ToString() );
4 base.OnPreInit(e);
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致WebForm.aspx与Default.aspx的区别_百度知道ASP.NET(149)
一、前台控件使用路由,通过表达式生成url地址,注意给路由参数赋值,防止使用了其他路由表达式值
&asp:HyperLink ID=&hlSupply& NavigateUrl='&%$RouteUrl:routename=TechSupplySearch,areacode=,techfield=%&'
&&&&&&&&&&&&&&& runat=&server&&技术供给&/asp:HyperLink&
&a href=&&%=GetRouteUrl(&MemberSearch&,new { membertype=&Commpany& ,areacode=&&,industrycode=&&,pageindex=&& })& %&&&科技企业&/a&
控件界面数据绑定中使用
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &asp:Repeater ID=&myGrid& ViewStateMode=&Disabled& runat=&server&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &ItemTemplate&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &li&&a target=&_blank& href='&%# this.GetRouteUrl(&TechSupplyView&, new { id=Eval(&SupplyId&)}) %&' &&%# Eval(&SupplyName&)%&&/a&&span&&%# string.IsNullOrEmpty(Eval(&cityname&).ToString())
? &&nbsp& : Eval(&cityname&)%&&/span&&span&&%# Eval(&hightech&)%&&/span& &/li&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &/ItemTemplate&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &/asp:Repeater&
url 路由分页控件:urlpager
二、服务端后台代码使用路由
1、Global.asax文件:
&&& void Application_Start(object sender, EventArgs e)&
&&&&&&& //在应用程序启动时运行的代码
&&&&&&&&RegisterRoutes(RouteTable.Routes);
&&& //注册url路由
&&& void&RegisterRoutes(RouteCollection routes)
&&&&&&& routes.RouteExistingFiles = //默认不路由与物理路径一致的url:如http://localhost/MyFolder/MyPage.aspx;好处是不对静态资源文件进行路由,否则静态文件如js、css等会导致多次触发Page_Load事件。
&&&&&&& //routes.Ignore(&{resource}.axd/{*pathinfo}&);//经实践这种方式屏蔽对静态资源文件的路由无效。
&&&&&&& //routes.Ignore(&{path}/{name}.jpg&);//经实践这种方式屏蔽对静态资源文件的路由无效。
&&&&&&& //注册路由
&&&&&&&&routes.MapPageRoute(&TechNewsSearch&, &TechNews/{pageindex}&, &~/NewsInfo/TechNewsSearch.aspx&, true, new RouteValueDictionary { { &pageindex&, &1& } }, new RouteValueDictionary { { &pageindex&,
@&\d{1,}& } });
&&&&&&& routes.MapPageRoute(&TechSupplySearch&, &Supply/{areacode}/{techfield}/{pageindex}&, &~/TechSupply/TechSupplySearch.aspx&, true, new RouteValueDictionary { { &areacode&, &0& }, { &techfield&, &0& }, { &pageindex&, &1& } }, new RouteValueDictionary {
{ &pageindex&, @&\d{1,}& } });
&&&&&&& routes.MapPageRoute(&MemberSearch&, &Members/{membertype}/{areacode}/{industrycode}/{pageindex}&, &~/Member/MemberSearch.aspx&, true, new RouteValueDictionary { { &membertype&, &0& }, { &areacode&, &0& }, { &industrycode&, &0& }, { &pageindex&, &1&
} }, new RouteValueDictionary { { &pageindex&, @&\d{1,}& } });
2、WebForm页面后台代码中使用
获取、更改路由参数值
routeValue = Page.RouteData.Values[&techfield&] == null ? string.Empty : Page.RouteData.Values[&techfield&].ToString();//获取路由参数
Page.RouteData.Values[&areacode&] = selOrgan.SelectedV//所在地&更改路由参数
Page.RouteData.Values.Remove(&Over&); //移除路由参数
后台代码中生成路由地址
newUrl = this.GetRouteUrl(&MemberSearch&, Page.RouteData.Values);
页面客户端跳转路由方式实现
Response.RedirectToRoute(&TechSupplySearch&, Page.RouteData.Values);
Response.RedirectToRoutePermanent(&TechSupplySearch&, Page.RouteData.Values);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:230196次
积分:3227
积分:3227
排名:第7495名
原创:17篇
转载:487篇
评论:15条
(4)(1)(3)(2)(1)(4)(3)(3)(2)(16)(8)(3)(3)(2)(1)(4)(2)(4)(12)(8)(31)(15)(4)(5)(9)(6)(2)(14)(4)(6)(11)(17)(41)(22)(19)(40)(19)(3)(1)(5)(5)(27)(4)(8)(2)(12)(4)(6)(14)(10)(21)(22)(3)(5)

我要回帖

更多关于 dev aspxformlayout 的文章

 

随机推荐