五月份有什么节日,说唱,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。
他们的共同点和区别在哪里?
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论