ASP.NET Button控件的UseSubmitBehavior属性引起的血案

这里先不说标题上的UseSubmitBehavior属性是什么,先说下面这种状况。html

一般,在咱们写一个表单页面的时候,最下方会有“提交”和“返回”字样的两个按钮。顾名思义,它们的功能你们都知道,可是通常状况下咱们会给表单的内容加上一些验证,这样就出现了一个问题。由于两个按钮是服务器控件(有runat=”Server”属性),因此点击按钮以后会先进行验证(不管这里你用的是前台的jQuery.validate验证或者是ASP.NET自带的后台验证控件验证,都会先进行验证)。对于“提交”按钮,这确实是咱们想要的,可是对于“返回”按钮,咱们并不想出现这种状况,而是想让它不通过验证,直接跳转回上一页。数据库

对于这种状况,我之前的解决方法就是把浏览器

<asp:Button ID="button_back" runat="server" Text="back" OnClick="button_back_Click" />

换成服务器

<input type="button" value="back" onclick="BackToPage();" />

这种形式。BackToPage方法实现页面跳转。工具

我相信不少朋友都是这么写的吧?反正能解决问题就行。为何?往下看。post

可是今天无心中发现了Button.UseSubmitBehavior这个属性,将其置成false,会使“返回”按钮“躲避”掉表单验证,直接执行点击事件中的方法。这正是咱们一直以来想要的不是么?并且按钮还很统一,不用去加额外的js代码。学习

这里要说明一下,你们不要觉得Button.UseSubmitBehavior真的是用来“躲避”验证的,我只是用这个词来表达一下它实现的效果。实际上Button控件有专门的属性是用来屏蔽验证控件的。就是Button.CausesValidation,经过名字咱们应该就能了解一二。spa

那你会不会问,“既然有这个属性,以上问题就不算是问题啦,能够很容易的解决。”插件

我想说,“是这样的啊!”但前提是,你的项目中只存在后台验证。可是现实中我以为不会全部人都这样作吧?反正我就蛮习惯用jQuery.validate验证插件的(前台验证)。那咱们继续研究Button.UseSubmitBehavior吧。code

看个例子:

前台代码:

<asp:Button ID="button_confirm" runat="server" Text="肯定" />
<asp:Button ID="button_back" runat="server" Text="返回"  onclick="button_back_Click" />

浏览器中查看源码中的形式

前台代码:

<asp:Button ID="button_confirm" runat="server" Text="肯定" />
<asp:Button ID="button_back" runat="server" Text="返回" UseSubmitBehavior="false" onclick="button_back_Click" />

浏览器中查看源码中的形式

你们能够看出加上UseSubmitBehavior属性后,解析成的html语句明显不一样。看到这我才恍然大悟,当加过UseSubmitBehavior属性以后,type属性变成了button,这样就跟以往的解决方法同样了啊,由于不是submit属性,因此也就不会触发jQuery.validate的验证方法(回答上面橙色加粗部分的为何)。这就是为何UseSubmitBehavior 置成false后,不用去进行前台验证的缘由。这就是谜底。

可是到这就结束了会不会以为有些怪呢?咱们为了达到咱们的目的,使用了一个新的属性,可是这个属性存在的意义并不是是为了达到咱们的目的。

整理一下思绪,上面的例子咱们须要从脑壳里抹去。UseSubmitBehavior属性与是否触发表单验证彻底没有任何关系。咱们来专一这个属性的自己,毕竟这个是标题。

我很俗的查了一下MSDN

能够看出重点就是图里指出的两个机制:

一、客户端浏览器的提交机制

二、ASP.NET 回发机制

解释一下,有错误的话请你们指正

一、你们能够看下这个连接所讲的第一部分:http://www.th7.cn/Program/net/201309/150415.shtml

就是浏览器会封装一个请求报文,发给服务器,服务器解析这个报文,进行重组,生成一个响应报文,回发给浏览器,浏览器收到后再对其进行解析,就生成了咱们看到的网页和一些咱们看不到的数据。它们之间的通讯都是遵循HTTP协议。

重点强调:HTTP是无状态协议,也就是说每次的浏览器请求,服务器响应都是全新的一次。

二、你们能够看下这个连接所讲的内容:http://blog.sina.com.cn/s/blog_7815564501012qgy.html   对于回发机制,我但愿你们能跟着这篇文章里讲的步骤写个小Demo试试,会更有感受。

回发机制,就是本身请求本身的页面,这个机制比较搞,若是你们理解上一个机制,就会发现ASP.NET回发机制与其是有点背离的,上一个是无状态的,这一个是能将前一次的值保存住,做为下一次页面的初值。

举个实际中的例子,就是当咱们在填写一个表单时,有好多好多项,可是当咱们填到倒数第二项的时候,不当心点击了刷新,正常按第一个机制来讲,表单内控件上的值应该所有被清空,由于此时尚未作数据库读取的操做,因此页面不可能有值,可是有了回发机制,__viewstate把页面保存了下来,这样就保留下了咱们先前填写的内容。不过技术群里的一个朋友说“如今这个东西已经不多会用了,基本不会用控件作项目开发。”囧rz啊~我一直都用的不亦乐乎,怎么破?

两个机制解释完了,可能你们仍是有点一头雾水,其实此时我也是同样。下面写个Demo让整件事情变得更清晰点吧,借用一下Fiddler 这个工具。

页面展现:

html代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server" method="post">
    <div>
        <asp:Label ID="Label1" runat="server" Text="content:" ></asp:Label>
        <asp:TextBox ID="textbox_content" runat="server" width="500px"></asp:TextBox>
        <asp:Button ID="button_usesubmitbehavior_true" runat="server" Text="browser-server" 
            onclick="button_usesubmitbehavior_true_Click" />
        <asp:Button ID="button_usesubmitbehavior_false" runat="server" Text="postback" 
            UseSubmitBehavior="false" onclick="button_usesubmitbehavior_false_Click" />
    </div>
    </form>
</body>
</html>

页面源码:

后台代码:

    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            textbox_content.Text += "M";
        }

        protected void button_usesubmitbehavior_true_Click(object sender, EventArgs e)
        {
            textbox_content.Text += "true";
            button_usesubmitbehavior_true.Text += "1";
            button_usesubmitbehavior_false.Text += "2";
        }

        protected void button_usesubmitbehavior_false_Click(object sender, EventArgs e)
        {
            textbox_content.Text += "false";
            button_usesubmitbehavior_true.Text += "3";
            button_usesubmitbehavior_false.Text += "4";
        }

    }

操做步骤:

一、初始页面

二、先连续点击browser-server按钮三次

 

三、再链接点击postback按钮三次。

 

经过这个demo示例,若是单从页面显示上看,咱们彻底看不到二者有什么不一样,由于后台想实现的功能二者都实现了(就是点击一下按钮,会通过一次page_load方法,而后再通过各自的click事件,给文本框和两个按钮追加内容)。可是利用fiddler工具,咱们会发现提交的表单内容的确是有些不同,UseSubmitBehavior属性设为false的按钮提交时,自己没有做为表单的参数传递给服务器端。

这就是惟一的不一样吗?感受仍是不够,不过我真的是写不动了。

有兴趣的朋友能够再想一想别的对比示例,好比试试在page上加EnableViewState="false" 这个属性,看看点击完按钮会是什么效果的。这个我也有试,不过感受仍是不能证实什么。

啊,最后终于想到了一个,你能够给browser-server按钮加上EnableViewState="false"属性,嗯嗯,这个比较靠谱,给browser-server 按钮加上EnableViewState="false"属性 ,目的就是让其没有回发机制,由于Asp.Net控件默认都会有回发机制,这样browser-server 按钮就只有单纯的客户端浏览器的提交机制,而postback按钮就只有回发机制。页面效果异常明显啊~

卖个关子,想看效果的朋友本身去试一下吧,你们能够留言作交流,原谅我,这篇文章写的属实有点累。

总结一下,UseSubmitBehavior 这个属性绝对能够说是非主流的,花时间去研究会不会很蛋疼?

其实最初根本没有想过这篇文章会写这么长,可是随着研究这个属性深刻,我去学习了ASP.NET的底层交互原理,ASP.NET页面生命周期,回发机制以及了解了验证相关的问题。说实话,收获蛮多的,也很开心。固然,还要继续实践,学习。

 

附件的连接:http://files.cnblogs.com/zhouhongyu1989/UseSubmitBehavior%E7%A4%BA%E4%BE%8BDemo.rar 

相关文章
相关标签/搜索