当前位置: 移动技术网 > IT编程>开发语言>.net > [ASP.NET]从ASP.NET Postback机制,到POST/GET方法

[ASP.NET]从ASP.NET Postback机制,到POST/GET方法

2018年09月13日  | 移动技术网IT编程  | 我要评论

五月份有什么节日,说唱,virpus

写这篇博客的起源来自于自己最近在学习asp.net时对于 postback机制的困惑。因为自己在解决困惑地同时,会不断产生新的疑问,因此博客最后深入到了http 包的格式和internet所使用的tcp/ip模型,算是来了一堂基础复习课。但我相信这些基础的牢固性,会影响到web方向的深入学习,因此整理成文,便于复习,便于探讨。

 

写博的时候并没有将http协议包格式等底层的东西调整到最前面写,因为我觉得既然我是这样思考的,何不这样呈现?为了便于描述,我用下图这棵树表示写这篇博文的思路,ispostback是表面的引起疑问的叶子,顺着这片叶子,可以逐渐追溯到http协议这个树干。“post与get方法”那一块被安排在树干上,是因为从这里开始,触及了web开发的主体;枝叶上的asp.net部分,只是基于这个主体又加入自己的技术的延伸。别的技术比如jsp,struts等java方向的技术,也是基于这个主体的另一种技术方向的延伸,因此它们都会像树枝一样,从主干上发散开。

 

博文中有任何觉得不对的地方,欢迎在留言中和我探讨。毕竟我也只是刚接触web不久的fresh man,行文之时,心下惴惴,因此欢迎指出错误和讨论。

 

 

 

postback机制

什么是postback?ispostback的作用是什么?

 

postback机制是asp.net特有的机制,为什么说特有,我们从web请求和响应说起。

 

 

 

web的基本原理就是请求和响应。以为例,browser端的html文本,以及javascript代码,运行后向server端发送script,server端的.asp脚本,接受request,处理后发出respond。这种server端script和client端script交互,完成一次次对于用户操作(提交表单,载入新的url)的响应。

 

以一个html文件和asp文件为例:

 

html代码:

 

复制代码

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "https://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">

<html xmlns="https://www.w3.org/1999/xhtml">

<head><title>order</title></head>

<body>

<h2>form example</h2>

<p>

please input and submit

<form method="post" action="response.asp">

<p>

姓: <input name="fname" size="48"/>

<p>

名: <input name="lname" size="48"/>

<p>

称呼: <input name="title" type=radio value="先生"/>先生

<input name="title" type=radio value="女士"/>女士

<p><input type=submit value="提交"/><input type=reset value="清除"/>

</form>

</body>

</html>

复制代码

response.asp脚本代码(vb语言)

复制代码

<html>

<head></head>

<body>

<%

title = request.form("title")

lastname = request.form("lname")

if title = "先生" then

response.write lastname & "先生"

elseif title = "女士" then

response.write lastname & "女士"

else

response.write request.form("fname") & " " & lastname

end if %>

</body>

</html>

复制代码

可以看到html文件的form控件中,"action"属性指定了form提交后处理它的server端脚本。

 

而在asp.net中,我们没有client端和server端脚本,我们只有aspx文件,而aspx也会被render为html,在client端通过显示,因为浏览器只能识别html标签。

 

下面的例子引自artech的浅谈asp.net的postback,这篇文章讲解了postback的实现方式,简单说来:render之后的html会自动加入一个form,其中用hidden的input来存储id和事件参数。在__postback这个函数中,form中的内容会被提交。artech所给的aspx代码在browser端的呈现出来的如下:

 

复制代码

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "https://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">

<html xmlns="https://www.w3.org/1999/xhtml">

    <head>

        <title>

            test page

        </title>

    </head>

    <body>

        <form name="form1" method="post" action="default.aspx" id="form1">

            <p>

                <input type="hidden" name="__eventtarget" id="__eventtarget" value="" />

                <input type="hidden" name="__eventargument" id="__eventargument" value="" />

                <input type="hidden" name="__viewstate" id="__viewstate" value="/wepdwukmta0ndq2ote5owrk281l4eak7izt10hzg+beoyouwbq=" />

            </p>

 

<script type="text/javascript">

                <!--

var theform = document.forms['form1'];

if (!theform) {

    theform = document.form1;

}

function __dopostback(eventtarget, eventargument) {

    if (!theform.onsubmit || (theform.onsubmit() != false)) {

        theform.__eventtarget.value = eventtarget;

        theform.__eventargument.value = eventargument;

        theform.submit();

    }

}

 

</script>

 

<p>

<span id="labelmessage" style="color:red;"></span>

</p>

<p>

    <input type="submit" name="button1" value="button1" id="button1" />

    <input type="button" name="button2" value="button2" onclick="javascript:__dopostback('button2','')" id="button2" />

    <input type="button" name="button3" value="button3" onclick="javascript:__dopostback('button3','')" id="button3" />

</p>

</form>

</body>

</html>

复制代码

以上代码在artech博文中也可以找到,我把它贴过来,以方便引述。这段代码是default.aspx被render到browser端的html源码,postback的实现机制就是定义了一个form,这个form中包含隐藏的input,从而保存需要post的值,那么,向哪里post?form中"action"属性指定了post的目标,那这里呢?我们可以看到其值为"default.aspx",也就是它自己。这和上面那个asp的例子中是不同的。

 

我的理解是:所谓postback,是指在asp.net机制中,不是client端发post请求到server端脚本,在这个机制中,aspx被render到browser后,其form的post目标依然是这个aspx。postback由此得名,因为post回来了。。

 

因此当我们触发网页的按钮时,若此按钮涉及到后台操作(在后端有c#响应代码,而非仅仅调用前端javascript函数),aspx页面便会重新加载,因为postback触发了它。(这句话待商榷,我对postback与page life cycle了解再深刻些后,会再编辑这句话)。

 

这个机制所需要解决的第一个问题是:当开发人员编写代码时,aspx的加载有两种原因:点击按钮触发post来让aspx加载;用户输入url来加载aspx。对于不同的原因,可能开发人员希望代码进入不同的处理逻辑。ispostback这个asp.net所给的变量,就是用来给developer确定是否这个网页是因为postback而加载,而是通过输入url或者刷新页面的方式来加载。

 

最简单的例子,在page_load()方法里经常会 if(!ispostback) bindform();//给表单所有控件赋值的方法。意思是提交后我就不绑定表单了,而是走click的具体事件方法。

 

而ispostback是何时被赋值的,asp.net代码中是根据什么条件来判断是否是postback的网页,这一个树枝暂时还没有研究下去,如果能有前辈能在留言中给我一些线索的话,感激不尽 :)

 

有关于page_load()方法,它是asp.net中的网页载入过程中page load事件的默认响应函数,具体请参见:

 

asp.net 页生命周期概述  以及 [asp.net]page life cycle整理

 

因此postback的机制本质实现其实是form的post,那么post和get,这些具体是什么?

 

post与get方法

正如之前所说,web实际就是request与respond的交互,那么,这些request与respond,其实就是http包。

 

对于一个request,它可能不仅仅是一个要求载入页面的request,也可能是要求发送一些数据的request,或者要求删除服务端一些数据的request,如何区分这些request?http给request定义了四个谓词:post,get,put,delete。从名字就可以看出来他们的功用,分别对应着改,查,增,删。

 

而最常使用的是get与post。

 

他们的共同点和区别在哪里?

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网