`
javatoyou
  • 浏览: 1068959 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用反射技术在asp.net页间传递对象

 
阅读更多
电子商务站点, 在一个完整的预订流程中, 用户的一些选择信息需要从一个页面传到下一个页面. 这是特别常用的需求. 一般的做法把这些信息一一的写进隐含域<input type=hidden value="xx"> 再post 到另外一页, 再一一接收. 或者放在Url 中传递.

在asp.net中我们习惯把这用户需求信息, 用一个实体类来表示. 像上面的这种需求, 我们就需要在每一个页面中, 新建实体, 接受参数, 为所有属性设值. 传递到下一页还得一一拿出来写进隐含域.

这样太烦了,程序员是最怕麻烦的. 我们很自然的就会想到下面的这几种办法.

1. 把整个实体写进Session . 这是很简单, 可Session 会过期, 又占用服务器的资源. 明显这做法是不可取的.

2. 用ViewState . viewstate 把值放在html里, 过期是不会. 又不占用服务器的资源. 这看上去不错. 可是ViewState 一般只能在同一页中使用. (当然你可以把你的站点改成使用一个页面实例) 但有一个最大的问题, 把一个对象序列化成字符动不动就上百K 的体积, 让人望而却步.

3. 在实体类中提供ToString()和 BuildObject(string str)方法, 把所有属性的值加成一个字符串, 用这个字符串来传递. 到了别外一页调用BuildObject方法, 分解字符串,重新还原成对象. 这样可以使一个对象在页之间的传递变得相对容易. 传递的字串符的量不大.还可以使用字符串压缩,无论是放在隐含域中还是Url 中都很方便.

但是第3种方法, 需要为每一个需要在页间传递的对象提供ToString()和BuildObject(string str)方法. 还是老话,程序员是最怕麻烦的.
我们可以再抽象一下. 提供一个基类来做这工作怎么样? 当然不错, 这样的我的这些对象就可以什么都不用做了, 直接继承于这个基类就行了. 可是这个基类怎么写呢? 在基类中,怎么能知道这个类中的所有属性呢? 你一定知道的 .net大名鼎鼎的反射技术.

下面就不用我说什么了, 我把代码放在下面:

实体的基类

1usingSystem;
2usingSystem.Reflection;
3
4namespaceWebApplication3
5{
6/**////<summary>
7///所有需要页间传递实体的基类.
8///</summary>

9[Serializable]
10publicclassRequestInfo
11{
12publicRequestInfo()
13{
14}

15
16//把实体的所有属性值传换成字符串
17publicvirtualstringToObjectString()
18{
19stringobjString=string.Empty;
20//得到所有Property
21PropertyInfo[]Propertys=this.GetType().GetProperties();
22inti=0;
23
24foreach(PropertyInfopiinPropertys)
25{
26objectoj=pi.GetValue(this,null);
27Typetype=pi.PropertyType;
28stringvalueStr=string.Empty;
29
30if(oj!=null&&oj.ToString()!=string.Empty)
31{
32if(type==Type.GetType("System.DateTime"))
33{
34valueStr=((DateTime)oj).ToShortDateString();
35}

36else
37{
38valueStr=oj.ToString();
39}

40
41objString+="|"+i.ToString()+"*"+valueStr;
42
43}

44i++;
45}

46objString=System.Web.HttpUtility.UrlEncode(objString);
47
48returnobjString;
49}

50
51
52//把字符串还原成对象
53publicvirtualRequestInfoBuildObject(stringobjString)
54{
55
56
57objString=System.Web.HttpUtility.UrlDecode(objString);
58
59objectnewObject=Activator.CreateInstance(this.GetType());
60
61PropertyInfo[]Propertys=newObject.GetType().GetProperties();
62inti=0;
63string[]propertyValue=newstring[Propertys.Length];
64string[]valueArray=objString.Split('|');
65
66//分解值.
67for(intj=0;j<valueArray.Length;j++)
68{
69if(valueArray[j]!=null)
70{
71intorder=0;
72string[]valuArray=valueArray[j].Split('*');
73if(valuArray!=null)
74{
75if(valuArray[0]!=null&&valuArray[0]!=string.Empty)
76{
77stringkey=valuArray[0].ToString();
78stringvalue=valuArray[1].ToString();
79if(key!=string.Empty)
80{
81order=int.Parse(key);
82}

83propertyValue[order]=value;
84}

85}

86}

87}

88//把值置进去.
89foreach(PropertyInfopiinPropertys)
90{
91if(propertyValue[i]!=null)
92{
93if(pi.CanWrite)
94{
95objectobb=propertyValue[i];
96Typetype=pi.PropertyType;
97obb=Convert.ChangeType(obb,type);
98pi.SetValue(newObject,obb,null);
99
100}

101}

102else
103{
104if(pi.CanWrite)
105{
106pi.SetValue(newObject,null,null);
107}

108}

109
110i++;
111}

112return(RequestInfo)newObject;
113
114}

115}

116}

117

一般的实体类.

1usingSystem;
2
3namespaceWebApplication3
4{
5/**////<summary>
6///SummarydescriptionforHotelRequestInfo.
7///</summary>
8///

9[Serializable]
10publicclassHotelRequestInfo:RequestInfo
11{
12privatestringhotelName;
13privatestringhotelID;
14privatestringcityName;
15privateintpersonNum;
16privateintroomNum;
17privateintstar;
18
19
20privateDateTimecheckInDate;
21privateDateTimecheckOutDate;
22
23publicHotelRequestInfo()
24{
25
26
27}

28
29publicstringHotelID
30{
31get
32{
33returnhotelID;
34}

35set
36{
37hotelID=value;
38}

39}

40
41
42
43publicstringHotelName
44{
45get
46{
47returnhotelName;
48}

49set
50{
51hotelName=value;
52}

53}

54
55
56publicstringCityName
57{
58get
59{
60returncityName;
61}

62set
63{
64cityName=value;
65}

66}

67
68publicintStar
69{
70get
71{
72returnstar;
73}

74set
75{
76star=value;
77}

78}

79
80publicintPersonNum
81{
82get
83{
84returnpersonNum;
85}

86set
87{
88personNum=value;
89}

90}

91
92publicintRoomNum
93{
94get
95{
96returnroomNum;
97}

98set
99{
100roomNum=value;
101}

102}

103
104publicDateTimeCheckInDate
105{
106get
107{
108returncheckInDate;
109
110}

111set
112{
113
114checkInDate=value;
115
116}

117}

118
119
120publicDateTimeCheckOutDate
121{
122get
123{
124returncheckOutDate;
125}

126set
127{
128
129checkOutDate=value;
130
131}

132}

133
134
135
136}

137}

138

使用的时候.

1HotelRequestInfomyInfo=newHotelRequestInfo();
2myInfo.HotelName=Request["hotelName"].ToString();
3myInfo.HotelID=Request["hotelId"].ToString();
4myInfo.Star=Request["star"].ToString();
7stringpValue=myInfo.ToObjectString();

页面中写:

<a href="WebForm5.aspx?pv=<% =pValue%>">下一页</a>

下一页中:

1HotelRequestInfomyInfo=newHotelRequestInfo();
2
3stringa=Request.Params["pv"].ToString();
4
5myInfo=(HotelRequestInfo)myInfo.BuildObject(a);
6
7Response.Write("<h1>第五页</h1>");
8Response.Write(myInfo.HotelName);
9Response.Write("<hrsize=1>");
10Response.Write(myInfo.HotelID);


分享到:
评论

相关推荐

    asp.net二进制反射机制

    1. 动态加载和实例化对象:在ASP.NET应用程序中,我们可能需要在运行时根据配置或用户输入动态加载某个类型的实例。反射使得这个过程成为可能,通过`Activator.CreateInstance()`方法,我们可以创建未知类型的实例。...

    【ASP.NET编程知识】asp.net利用反射实现给model类赋值的方法.docx

    ASP.NET 编程语言中,使用反射实现给 Model 类赋值的方法是一种常见的技术。通过使用反射,开发者可以动态地将数据库查询结果赋值给 Model 类的属性,从而简化数据访问和业务逻辑处理。 在本文中,我们将学习如何...

    asp.net程序性能优化的七个方面

    - **减少视图状态(ViewState)的使用**:ViewState在页面间传递数据,但也会增加页面大小,影响加载速度。只在必要时使用。 - **异步处理**:使用ASP.NET的异步处理模型,尤其是对于I/O密集型任务,可以提高用户...

    【ASP.NET编程知识】ASP.NET过滤类SqlFilter,防止SQL注入 .docx

    ASP.NET过滤类SqlFilter的目的是防止SQL注入攻击,这是一种常见的网络安全威胁。SQL注入允许恶意用户通过输入特殊构造的参数,使得后台系统执行非预期的SQL命令,从而可能获取敏感数据或破坏数据库。例如,如果一个...

    C#和ASP.Net面试题目集锦

    事件则是在对象间传递信息的方式,遵循发布/订阅模式。 5. **异步编程**: 使用async/await关键字进行异步操作,能够在执行长时间运行任务时避免阻塞主线程,提高应用程序的响应性。 6. **LINQ (Language ...

    .net中反射和序列化示例

    - 传递数据到客户端:Web API或ASP.NET MVC应用中,将对象序列化为JSON或XML,作为HTTP响应返回给客户端。 - 保存配置:将复杂配置对象序列化,便于持久化和加载。 在“反射”文件中,可能包含如何使用反射创建和...

    asp.net用户控件分页

    在ASP.NET用户控件中,如果需要从父页面(通常是主页面或包含该用户控件的页面)中调用某些方法,但由于在编译时没有直接引用,我们可以使用反射来实现。例如,用户控件可能有一个事件,当用户点击分页按钮时触发,...

    Asp.net面试题

    这通常用于持久化对象或在网络间传递对象。反序列化是将这些数据恢复为原来的对象。在.NET中,可以使用`BinaryFormatter`或`XmlSerializer`等类进行序列化。 3. **数组到ArrayList的复制**:数组可以使用多种方法...

    ASP.NET 动态查询控件只针对GridVeiw

    在ASP.NET中,可以利用Linq to SQL或Entity Framework等ORM(对象关系映射)工具来简化这一过程,它们支持动态构建查询,使得可以根据运行时的条件生成不同的SQL语句。 在提供的文件"query.ascx"和"query.ascx.cs...

    ASP.NET通过反射获取泛型列表

    本示例展示了使用工厂方法设计模式,利用反射,通过泛型接口获取具体类型的列表。比如,要返回一张表的数据,通常使用List&lt;具体表名&gt;,本示例源码展示了通过类型参数传递表名,使用List的形式返回具体的表数据

    c#笔试题asp.net笔试题

    在IT领域,C#和ASP.NET是Microsoft开发的用于构建Web应用程序的关键技术。C#是一种面向对象的编程语言,而ASP.NET则是一个用于构建动态网站、Web应用和服务的框架。下面将详细探讨这些笔试题目中的关键知识点。 1. ...

    [ASP.NET.AJAX编程参考手册(涵盖ASP.NET.3.5及2.0)].(美)霍斯拉维.扫描版.pdf

    《*** AJAX编程参考手册》是针对*** AJAX技术的一本权威指南,它详细介绍了*** AJAX在客户端和服务器端框架中的应用。作者Shahram Khosravi通过本书深入讲解了如何使用*** AJAX技术来开发丰富的、动态交互式的Web...

    Asp.net2.0面试题60道(附参考答案

    2. ASP.NET页面间传递值的方法 - `QueryString`:通过URL参数传递,适用于少量、不敏感的数据。 - `Session`:存储在服务器端,生命周期较长,适用于跨页面的会话数据。 - `Server.Transfer`:服务器内部转移,...

    Asp.net2.0面试题(word文档)

    在 ASP.NET 2.0 面试中,面试官通常会关注候选人在ASP.NET、C#、ADO.NET等关键领域的知识掌握程度。以下是对这些知识点的详细解释: 1. **ASP.NET 页面加载过程**: - ASP.NET页面生命周期包括初始化、加载、验证...

    asp.net面试题

    在ASP.NET面试中,考察的知识点广泛且深入,涵盖了语言特性、并发控制、异常处理、数据结构等多个方面。以下是对这些面试题涉及知识点的详细解释: 1. **类与结构的区别**:类是引用类型,结构是值类型。类可以有...

    C#、asp.net基础知识集锦

    4. ASP.NET页面间传递值的方式: - QueryString:通过URL参数传递,简单但不安全,且长度有限。 - Session:存储在服务器端,用户会话期间有效,但容易丢失。 - `Server.Transfer`:服务器内部转移,保持状态,但...

    亮剑.NET深入体验与实战精要2

    1.6.1 如何创建ASP.NET项目 58 1.6.2 如何创建Windows项目 61 1.6.3 Visual Studio.NET 2008 操作与使用技巧 61 1.6.4 常见开发调试技巧 66 1.6.5 错误异常处理方法 70 本章常见技术面试题 76 常见面试技巧之面试...

Global site tag (gtag.js) - Google Analytics