传统的WEB编程能引起页面表单提交的元素为:
INPUT type=submit 元素 | input type=submit 对象
创建一个按钮,该按钮单击后将提交表单。
INPUT type=image 元素 | input type=image 对象
创建一个图像控件,该控件单击后将导致表单立即被提交。
还有一个提交From的方法:
submit;
相信我不解释你也知道这个的方法的用法!!好的,看看Asp.Net生成的页面文件,是不是能逃脱这个宿运?随便Create一个工程,拖一个服务器控件button进来,运行,看生成的客户端代码:怎么样?看出来倪端吧?
<asp:Button ID="btnTest" runat="server" OnClick="btnTest_Click" Text=" 测 试 " />
<input type="submit" name="btnTest" value=" 测 试 " id="btnTest" />
其实所有的服务器控件都会生成类似这样的客户端代码,服务器控件是微软的一大创举,颠覆了传统的WEB的开发模式,创造性地应用了经典C/S事件驱动模式,天然的是Asp.Net模型符合MVC模式!
呵呵,Net如何把服务器控件Button解释成上述客户端的呈现哪?Good!请看微软实现Button的代码:
首先构造函数继承基类如下:
public Button() : base(HtmlTextWriterTag.Input)

{
}
说明他首先在客户端生成一个<input>元素,再看:
protected override void AddAttributesToRender(HtmlTextWriter writer)

{
bool useSubmitBehavior = this.UseSubmitBehavior;
if (this.Page != null)

{
this.Page.VerifyRenderingInServerForm(this);
}
if (useSubmitBehavior)

{
writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
}
else

{
writer.AddAttribute(HtmlTextWriterAttribute.Type, "button");
}
//省略了其他代码…………………………………………………….
base.AddAttributesToRender(writer);
}注意useSubmitBehavior,这个是button属性:表示是否这个按钮呈现为提交按钮(说白了是否设定input
的type是否为sumbit)!默认情况下是TRUE!
代码如下:
sumbit writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
完成一系列其他的修饰后在调用基类的AddAttributesToRender(writer)!
呵呵,如果你是细心的人,你会注意到上面我们说过 useSubmitBehavior,它默认是True,你会说,如果我把他设成False,他生成的客户端元素<inpput>的代码属性不再会是submit,而是button,而这个属性点击后不会触发表单提交!看看微软如何解决这个问题的。好,还是先看客户端代码:
<asp:Button ID="btnTest" runat="server" OnClick="btnTest_Click" Text=" 测 试 " UseSubmitBehavior="False" />被解释(应该叫编译)成
<input type="button" name="btnTest" value=" 测 试 " onclick="javascript:__doPostBack('btnTest','')" id="btnTest" /> 
注意到有什么变化吗?客户端多了onclick="javascript:__doPostBack('btnTest','')",我塞,你真牛,这都被你看出来了!在看看服务器端多了什么?UseSubmitBehavior="False",呵呵,又被你看出来了!
那么这两者肯定有必然的联系!靠,这个你又猜到了!I Flow You!这个放后再说,先看下面:
既然客户端多了一个
onclick="javascript:__doPostBack('btnTest','')",
那客户端肯定存在__doPostBack(Argumen1, object Argument1) ,仔细看下你生成的页面代码:
是不是有这段代码存在:
<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>
先解释下,__doPostBack就是触发表单提交的客户端函数,参事一是触发事件的控件,参数二十事件的所带的参数!__EVENTTARGET和EVENTARGUMENT为隐藏的Input元素!!
这段代码如何生成的哪?回去再看Button的实现代码:
protected internal override void OnPreRender(EventArgs e)

{
//…….省略其它代码
else if (!this.UseSubmitBehavior)

{
this.Page.RegisterPostBackScript();
}
}
}

注意 this.Page.RegisterPostBackScript();这个就是罪魁祸首了!