오프닝 개요
초보자라면 페이지 간 값을 옮기는 것만이 갈 수 있는 유일한 방법이지만, 그들에게는 어려움이기도 하다. 사실 대부분의 전문가에게는 어렵지 않을 수도 있습니다.
2016년 300명 가까이 인터뷰한 사람들을 돌아보면 인턴, 신입, 경력 1~3년, 경력 3~5년, 경력 5~10년이 있었다. 나는 거의 모든 인터뷰 대상자들에게 "당신이 알고 있는 페이지 간 가치 전달의 여러 형태와 방법에 대해 알려주고, 그 원리와 프로세스를 설명해주세요."라고 대답할 뻔했습니다. 결과는 별로 이상적이지 않습니다. 유형별로는 5가지 정도 대답하는 사람이 대부분이고, 8가지 유형으로 대답하는 사람은 극소수입니다. 그러나 깊이 측면에서 보면 철저하게 분석할 수 있는 사람은 거의 없습니다. 각 방법의 원리와 프로세스(물론 이러한 원리와 프로세스를 철저하게 분석하려면 페이지 수명 주기 및 페이지 원리, 반사, IIS가 요청을 구문 분석하는 방법 등, CLR, GC 등 기본 사항을 연구해야 합니다. , 디컴파일 등).
대략적으로 요약하면 ASP.NET 페이지 간에 값을 전송하는 방법은 크게 다음과 같은 유형으로 나눌 수 있습니다. Request.QueryString["name"],Request.Form("name") , 세션, 쿠키, 캐시, 애플리케이션, Server.Transfer, 데이터베이스, HttpContext의 항목 속성, 파일, 데이터베이스 등
각 메소드에 대한 자세한 설명
1. Request.QueryString
핵심 코드:
protected void getQueryString_Click(object sender, EventArgs e) { string QueStr = Request.QueryString["name"]; Response.Write(QueStr); }
요약:
1. QueryString : http 쿼리 문자열 변수 컬렉션을 가져옵니다. Request.QueryString[문자열 이름] 및 Request.QueryString[int index];
라는 두 가지 오버로드가 있습니다. 2. Request.QueryString은 주로 url:a와 같이 URL에서 "?" 뒤에 있는 매개변수를 가져옵니다. .aspx?name="queryString"이면 Request.QueryString["name"] 값은 "queryString"입니다.
2. Request.Form
핵심 코드:
protected void getQueryString_Click(object sender, EventArgs e) { string strQueForm = Request.Form["TextBox1"]; Response.Write(strQueForm); }
요약:
1. Request.Form은 양식 변수 컬렉션을 가져옵니다. Request.Form[문자열 이름] 및 Requst.Form[int index]라는 두 가지 오버로드가 있습니다.
2. 지정된 이름의 매개변수 값을 양식으로 가져옵니다.
3. 세션
1. 세션 기본 동작
a. 세션 생성
//创建Session public void createSession(string[] arrStr) { //创建数组 string[] str=new string[arrStr.Length]; for (int i = 0; i < arrStr.Length; i++) { str[i] = i.ToString(); Session[str[i]] = arrStr[i]; } }
b. 🎜> c. 세션 트래버스
string getSessionValue=Session["name"].ToString();
d. 세션을 지우되 세션을 종료하지 마세요.
//遍历Session public void getSession() { IEnumerator sessionEnum = Session.Keys.GetEnumerator(); while (sessionEnum.MoveNext()) { Response.Write(Session[sessionEnum.Current.ToString()].ToString()+";"); } }
e. >
//清空Session,但不结束会话 public void clearSession() { Session.Clear(); }
mode: 세션 데이터 저장 설정을 나타냅니다. 형식 및 위치;
a. Off: 세션 비활성화
b. Inproc: 세션이 IIS 프로세스에 저장됨을 의미합니다. 성능이 높으며 IIS를 다시 시작하면 세션 정보가 손실됩니다(기본값)
c. SateServer: ASP.NET 상태 서비스 프로세스에 세션을 저장합니다(웹 응용 프로그램을 다시 시작할 때 세션 상태를 유지하고 세션을 만듭니다). 네트워크에서 사용 가능한 상태) 여러 웹 서버);
d. SQL Server에 세션 저장
쿠키 없음: 세션 양식 및 위치를 저장하도록 클라이언트 설정
a. true: 쿠키 없는 모드를 사용하면 클라이언트의 세션 정보가 더 이상 쿠키를 사용하여 저장되지 않고 URL을 통해 저장됩니다.
b, false: 쿠키 모드를 사용합니다. 기본값입니다.
timeout은 서버가 자동으로 세션 정보를 포기하는 시간(분)을 설정합니다. 기본값은 20분입니다.
stateConnectionString은 상태 서비스에 세션 정보를 저장할 때 사용되는 서버 이름과 포트 번호를 설정합니다(예: "tcpip=127.0.0.1:42424"). 이 속성은 mode 값이 StateServer인 경우 필수입니다. (기본 포트 42424);
sqlConnectionString SQL Server에 연결할 때 연결 문자열을 설정합니다. 예를 들어 "데이터 소스=localhost;통합 보안=SSPI;초기 카탈로그=joye"입니다. mode 값이 SQLServer인 경우 이 속성이 필요합니다.
stateNetworkTimeout은 StateServer 모드를 사용하여 세션 상태를 저장할 때 몇 초의 유휴 시간 후에 연결된 TCP/TCP/IP 연결을 끊는지를 설정합니다. 기본값은 10초입니다.
3. 세션 원칙
세션이 도입된 이유는 무엇인가요? 우리 모두 알고 있듯이 http는 상태 비저장 프로토콜이기 때문에 Session이 이러한 단점을 보완합니다. 물론 Session의 역할은 이것보다 훨씬 더 크기 때문에 여기서는 다루지 않겠습니다.
ASP.NET의 세션은 클라이언트(Goggle, Firefox, IE 등)와 서버 간의 세션을 나타내며, 정확히 말하면 특정 세션 정보를 저장하는 데 사용됩니다. 사용자 정보. 클라이언트가 로그인한 사용자 ID 등의 요청을 서버에 보내고, 서버가 요청을 받으면, 서버측 Session은 로그인한 사용자와 관련된 SessionID를 생성하고, 그 SessioID를 클라이언트에 반환합니다( Goggle, Firefox, IE 등) 새 세션이 시작되면 서버는 SessionID를 사용자 브라우저에 쿠키로 저장합니다.
요약:
1. 정의: System.Web.SessionState.HttpSessionState Page.Session //ASP.NET에서 제공하는 현재 Session 개체를 가져옵니다.
2. 특징:
a. 세션은 중국어로 "세션"을 의미하며, 클라이언트와 서버 간의 세션을 의미합니다. 웹에서.
b. 세션은 서버 측 메모리에 저장됩니다.
c. 세션은 사용자 정의 개체를 포함한 모든 유형의 데이터를 저장할 수 있습니다.
d、Session与Session间是相互独立的,互不干扰。
e、Session与Cookie配对使用,Session在服务器端产生SessionID,并将该SessionID返回给客户端(IE,FireFox,Google等),客户端Cookie来存储该SessionID,整过会话过程中,只要保存SessionID的Cookie不丢失,则Session的信息就不会丢失。
f、Session保存的数据可以跨页访问,即跨页面是全局的。
g、Session不能跨进程访问,只能由该会话用户访问。
h、可以在不结束会话的条件下,清除Session信息,即调用Session.Clear();
i、当会话结束,过期,服务器就会清除Session对象。
j、Session常用于保存登录用户的ID.
四、Application
核心代码:
(1)a.aspx
private void Button1_Click(object sender, System.EventArgs e) { Application["name"] = Label1.Text; }
(2)b.aspx
private void Page_Load(object sender, EventArgs e) { string name; Application.Lock(); name = Application["name"].ToString(); Application.UnLock(); }
总结:
1、Application对象的作用范围是整个全局,也就是说对所有用户都有效。它在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取。它和Session变量的区别在于,前者是所有的用户共用的全局变量,后者是各个用户独有的全局变量。可能有人会问,既然所有用户都可以使用application变量,那他可以用在什么场合呢?这里举个例子:网站访问数。多个请求访问时都可以对它进行操作。
2、优点:使用简单,消耗较少的服务器资源;不仅能传递简单数据,还能传递对象;数据量大小是不限制的。
3、缺点:作为全局变量容易被误操作。所以单个用户使用的变量一般不能用application。
4、在源页面的代码中创建你需要传递的名称和值构造Application变量:Application["name"]="Value(Or Object)";在目的页面的代码使用Application变量取出传递的值。Result = Application["name"]。
5、常用lock和unlock方法用来锁定和解锁,为了防止并发修改。
五、Cache
核心代码:
//Class1 Cache["id"] = TextBox1.Text; Response.Redirect("~/WebForm1.aspx"); //Class2 if (Cache["id"]!=null) { Label1.Text = Cache["id"].ToString(); } //移除缓存 Cache.Remove("id"); //如果 Cache["id"]为空,则传值失败。可使用如下方法实 //限期为10分钟 Cache.Insert("id",TextBox1.Text,null,Cache.NoAbsoluteExpiration,new TimeSpan(0,10,0));
总结:
1、应用程序中的缓存机制用于将需要大量服务器资源来创建的对象存储在内存中,以此大大改进应用程序的性能。这个机制同样可以用来传值。
2、与其他方法不同的是,该方法需要设置缓存项优先级和缓存时间。因为当系统内存缺乏时,缓存机制会自动移除很少使用或优先级较低的项,从而造成传值失败。
3、该方法的优点是传递数据的大小和数量无限制,速度快。缺点是缓存机制的操作相对比较复杂。
六、Cookie
核心代码:
//Class1 HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie"); Response.Redirect("~/Class2.aspx"); //Class2 Label1.Text = Request.Cookies["testCookie"].Value;
总结:
1、Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户访问某网站时用户的ID,用户的偏好等,用户下次访问就可以通过检索获得以前的信息。所以Cookie也可以在页面间传递值。
2、Cookie通过HTTP头在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,如果想在Cookie存储整数值,那么需要先转换为字符串的形式。
3、与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。
4、使用简单,是保持用户状态的一种非常常用的方法。比如在购物网站中用户跨多个页面表单时可以用它来保持用户状态。
5、常常被人认为用来收集用户隐私而遭到批评。
6、安全性不高,容易伪造。
七、Context.Items["id"]
核心代码:
//Class1 Context.Items["id"]=TextBox1.Text; Server.Transfer("~/Class2.aspx"); //Class2 Label1.Text=Context.Items["id"].ToString(); Context.Items.Remove("id"); //移除项
1、Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求、响应、以及上文中的Session 和Application 等信息。
2、可以使用此对象在网页之间共享信息,从而实现页面间的传值。
3、与使用 Form 的方法类似,该方法也能保持大量的数据,缺点也相同,但使用方法相对比较简单。
八、ViewState
核心代码:
//Class1 ViewState["id"]=TextBox1.Text; //数据保存 Label1.Text=ViewState["id"].ToString(); //数据取出 ViewState.Remove("id"); //数据移除
总结:
1、ViewState 是ASP.NET 用来在同一页面的多个请求之间保存和还原服务器控件视图状态的一种机制。与传统的“同一页面”不同,ASP.NET 中“同一页面”的每一个请求都会导致服务器重新生成该页面,但是新生成的页面并不包含原来页面的数据。(页面无状态性)
2、ViewState 的任务就是保存原来页面中服务器控件视图状态的数据供新页面使用。从这个意义上讲,ViewState 也可以看作是一种在页面间传递数据的工具。
3、ViewState 的工作原理是:作为一个隐藏的窗体字段在客户端和服务器之间传递,可见,滥用ViewState 会加重页面回传的负担,从而降低应用程序的性能。
此外,ViewState 也能被控件、页面和应用程序禁用。
九、web.config和machine.config
核心代码:
//Class1 using System.Web.Configuration; WebConfigurationManager.AppSettings.Set("userName",TextBox1.Text); Response.Redirect("~/Class2.aspx"); //Class2 using System.Web.Configuration; Label1.Text = WebConfigurationManager.AppSettings["userName"];
总结:
1、每个Web运用程序继承web.config文件和machine.config文件的设置。
2、web.config和machine.config这两种文件保存数据一般都很小,多为明文,特别适合保存一些字符串常量,如数据库连接信息。此外,web.config文件是可以扩展的,因此,也可以用来传递变量。由于这两种文件会被自动缓存,所以不存在因磁盘IO产生的性能瓶颈等问题。要注意的是文件中某些设置会导致文件被修改后Web运用程序的重启。
3、web.config:你可以向单个Web运用程序运用设置。例如,你可能会希望设置特定的验证方法、调试的类型、默认语言或自定义的错误页面。但如果你要使用这些设置,必须把web.config文件放到web运用程序的根虚拟目录下。要想在Web运用程序中进一步配置自己的子目录,需要 在这些文件夹中放置附加的web.config。(关于ASP.NET web.config文件详细介绍,可参考我另外一篇博客:ASP.NET web.config)
4、machine.config:从c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目录中的一个叫macine.config的文件开始 配置。machine.config文件定义支持的配置文件节,配置ASP.NET工作者进程,注册可用于高级特性(如配置文件、成员资格以及基于角色的安全等)提供程序。(关于ASP.NET machine.config文件的详细介绍,我之后会写一篇文章来介绍)
十、Static
核心代码:
//class1 public static string userName;//在class1中定义静态全局变量 userName=txtBoxUserName.Text; Response.Redirect("~/class2.aspx"); //class2 Label1.Text=Src.id;
总结:
1、这个应该是非常容易理解的,在ASP.NET中,每个页面对应一个具体的类,既然如此,那么页面之间的传递,我们就可以归结为:类与类之间数据的传递。想到这一步,问题应该就迎刃而解了, 因为我们可以利用类之间的公关静态变量来解决这个问题。
2、若合理利用,可以有效地提高数据传递效率,但若滥用,可能会导致用户或页面间数据紊乱,存在一定风险和隐患,应谨慎使用。
提出以下问题:大家可以分析一下,以下代码有什么问题?
//Class1 protected void btnRedirect_Click(object sender, EventArgs e) { string userName = txtBoxUserName.Text; Response.Redirect("~/Class2.aspx"); } //Class2 Lable1.Text=userName;
十一、补充常用页面之间跳转
1.最常用的页面跳转(原窗口被替代):Response.Redirect("XXX.aspx");
2.利用url地址打开本地网页或互联网:Respose.Write("3b3250e2fb6fee097dfc5b2401f72300window.open('"+ url+"');2cacc6d41bbb37262a98f745aa00fbf0");
3.原窗口保留再新打开另一个页面(浏览器可能阻止,需要解除):Response.Write("3f1c4e4b6b16bbbd69b2ee476dc4f83awindow.open('XXX.aspx','_blank')2cacc6d41bbb37262a98f745aa00fbf0");
4.效果同1中的另一种写法:Response.Write("3f1c4e4b6b16bbbd69b2ee476dc4f83awindow.location='XXX.aspx'2cacc6d41bbb37262a98f745aa00fbf0");
5.也是原窗口被替代的 (常用于传递session变量的页面跳转):Server.Transfer("XXX.aspx");
6.原窗口保留,以对话框形式打开新窗口:Response.Write("3f1c4e4b6b16bbbd69b2ee476dc4f83awindow.showModelessDialog('XXX.aspx')2cacc6d41bbb37262a98f745aa00fbf0");
7.对话框形式打开新窗口,原窗口被代替:Response.Write("3f1c4e4b6b16bbbd69b2ee476dc4f83awindow.showModelDialog('XXX.aspx')2cacc6d41bbb37262a98f745aa00fbf0");
8.打开简洁窗口:Respose.Write("3b3250e2fb6fee097dfc5b2401f72300window.open('"+url+"','','resizable=1,scrollbars=0,status=1,menubar=no,toolbar=no,location=no, menu=no');2cacc6d41bbb37262a98f745aa00fbf0");
9.利用vs2008端口:System.Diagnostics.Process.Start(http://localhost:3210/系统管理员.aspx);
注释:比较简单,我这里就不论述了。
总结:
关于页面之间传值,还有很多方法,如文件传值、数据库传值,ViewBag等等,在这里就不一一论述了。若以后有时间,将会在此基础上补充,并逐步完善该篇博文。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。
更多详解ASP.NET 页面之间传值的几种方式相关文章请关注PHP中文网!