上篇文章中讲了关于Page类的IsPostBack属性的相关知识,并引发了思考。本文中,将借助实例,
来帮助大家更好的理解WebForm中的这些知识,相信读者会有意外的收获。
WebForm技术,看起来简单,做起来也看似很简单,但你真正深入去思考,去探索,会发现其非常非常的复杂。
好了,首先借助一个实例,来探索当发生“跨页投递”的这种情况时候,当前“响应页面”的IsPostBack和“请求页面”的IsPostBack值。
先建立两个新的aspx(WebForm) 页面,然后在其中一个页面上(我这里用WebForm2.aspx页面),拖入一个服务端的Button按钮,将其PostBackUrl属性设置,如下
[csharp] view plaincopyprint?
- <asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="~/WebForm1.aspx" />
我这里就直接用WebForm1.aspx作为“响应页面”,用来响应这个跨页请求。注意一下路径,否则会请求失败的。
启动调试后,点击WebForm2.aspx页面上的Button按钮,果然跳进WebForm1.aspx页面的后台了,
监视“响应页WebForm1.aspx”对应的Page类的IsPostBack属性,发现为false。如图:
.gif)
有的朋友肯定会忍不住问了,那“请求页”WebForm1.aspx对应的Page类的IsPostBack属性呢?提示大家,
使用PreviousPage就可以获取“请求页”对应的Page类啦。
呵呵。结果如下图:
.gif)
o(∩_∩)o 哈哈。居然是true,好像应正了上文中的总结哦。
接下来,新建一个html页面,将其form表单的属性设置一下,同样是交给webform1.aspx去“处理、响应”,如下:
[html] view plaincopyprint?
- <form action="WebForm1.aspx?abc=123" method="post">
再调试进webform1.aspx的后台,监视其IsPostBack属性,不用说了,肯定也是false撒,
值得提醒大家的是,这里就不能用PreviousPage这个属性了。有图为证:
.gif)
细心的朋友会发现,我在设置html页面的form表单属性时,还用url传参了 <form action="WebForm1.aspx?abc=123" method="post">
这样做,是为了讲解下一个问题。也是解答一个网友的疑惑,可能很多人都会疑惑。html代码如下:
[html] view plaincopyprint?
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title></title>
- </head>
- <body>
- <!--你们一个个都答非所问,尽扯些没用的.其实你已经指定了method="post",就说明你这个请求是post,并非get/post并存.
- 你只是在这次post请求的时候,使用url传递参数,而并非get请求.
- 当这种情况时候,表单项的name和url中的key一样时,优先取url中的,所以会是123-->
- <form action="WebForm1.aspx?abc=123" method="post">
- <input type="text" name="abc" />
- <input type="submit" value="提交" />
- </form>
- </body>
- </html>
在这个html中,指定了action,并使用url传值了。有人会和那哥们儿一样疑惑,这到底是get请求,还是post请求呢?
我可以明确的告诉大家,这是个post请求。只是借助url传值罢了。取值如下:
[csharp] view plaincopyprint?
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
-
- string a = Request.Form["abc"];
- string b = Request["abc"];
- string c = Request.QueryString["abc"];
- }
- string dd = Request.Form["abc"];
- string ee = Request["abc"];
- string ff = Request.QueryString["abc"];
-
- bool preResult = PreviousPage.IsPostBack;
- }
.gif)
看明白了吗?当Request.QueryString["abc"]和Request.Form["abc"]中具有相同的key值时,但是其对应的value不一样(一个是url中传来的值,一个是form表单提交过来的)那这种情况下,我们使用Request["abc"]取值,到底取得是谁的呢?前面我们也说过,Request[]包含了所有请求信息。。。根据上面的实例推断,其实是QueryString["key"]对应的value优先级更高,我们使用Request["abc"]取到的值,其实是Request.QueryString["abc"]的值,而不是用Request.Form["abc"]取得的form传过来的值。
一般的情况下,只有通过提交form表单传值或者get请求的url传值(即便post表单时候同时也用url在传参,url传值的key也不会那么凑巧和form表单中的元素同名),使用Request["key"]取到的值其实就是Request.Form["key"]的值。同理,使用单纯的get请求时候,使用Request["key的值"],就是Request.QueryString["key"]的值。
好了,今天就讲到这里。后续,我会逐渐积累,由浅入深去给大家讲解更多webform相关的技术(尤其是原理性和比较深层的东西)。
|