这两天把Fish li 的《细说Form(表单)》这篇文章看完,看了之后,感觉有点心得,记录一下。
按理说表单提交应该是每个开发人员的娴熟的基本功之一,无论是Get或者Post提交的方式,应该都要理解其中的运行机制,这我就不多说了。我之前是从Asp服务端脚本语言开始学起编程的,对于Asp的表单提交,总有一个页面进行表单提交之后的服务端数据处理的,所以对于Asp.Net回传机制刚开始理解的不是很透彻,毕竟把前台的代码绑定到.cs文件中,然后对于服务端的数据进行有效的处理,这样做确实适合刚入门的开发者学习,上手也快,因为MS都已经把相应的服务端控件都封装的很好了,用起来也是很方便的,不过有一点不好的是,浏览器解析之后的代码容易产生冗余代码,会影响服务端性能的。
这篇文章里提到了几个表单的提交方式,我认为都挺不错的,对于其中的编码方式,在没看到这篇文章之前,真不知道。application/x-www-form-urlencoded 和 multipart/form-data 这两种在请求体中经过一种编码规则来处理的。
其中对于一个控件是不是成功控件的判断几点如下:
1. 控件不能是【禁用】状态,即指定【disabled="disabled"】。即:禁用的控件将不是成功控件。
2. 如果一个表单包含了多个提交按键,那么仅当用户点击的那个提交按钮才算是成功控件。
3. 对于checkbox控件来说,只有被用户勾选的才算是成功控件。
4. 对于radio button来说,只有被用户勾选的才算是成功控件。
5. 对于select控件来说,所有被选择的选项都做为成功控件,name由select控件提供。
6. 对于file上传文件控件来说,如果它包含了选择的文件,那么它将是一个成功控件。
7.对于checkbox, radio button来说,如果它们被确认为成功控件,但没有为控件指定value属性, 那么在表单提交时,将会以"on"做为它们的value
8.如果在服务端读不到某个表单控件的值,请检查它是否满足以上规则。
那么浏览器如何处理表单:
1. 识别所有的成功控件。
2. 为所有的成功控件创建一个数据集合,它们包含 control-name/current-value 这样的值对。
3. 按照form.enctype指定的编码规则对前面准备好的数据进行编码。编码规则将放在请求中,用【Content-Type】指出。
4. 提交编码后的数据。此时会区分post,get二种情况,提交的地址由form.action属性指定的。
其中的一个问题我比较喜欢,就是如何避免表单F5刷新重复提交的问题,个人感觉作者写的真不错!
那么如何避开这个问题呢?办法大致有2种:
1. PRG模式(Post-Redirect-Get),在事件处理后,调用重定向的操作Response.Redirect(), 而不要在事件处理的后期再去给一些服务器控件绑定数据项了!
建议:按钮事件只做一些提交数据的处理,将数据绑定的操作放在OnPreRender方法中处理,而不是写在每个事件中(遍地开花)。 不过,这种方式下,可能伟大的ViewState就发挥不了太大的作用了,如果您发现ViewState没用了,在Web.config中全局关掉后, 又发现很多服务器控件的高级事件又不能用了!
2. 以Ajax方式提交表单。
最好,我感觉用Ajax来处理表单提交过来的数据非常酷,记得以前在公司如果是开发一个专题的话,涉及到表单提交的地方,可以多用Ajax提交来处理数据,这样做的好处就是专题可能就是一段时间用的,过了就不用了,然后都是一个页面,没跳转页面的,只不过都是友好的提示信息,增加用户体检感。如果是后台的处理表单提交的话,可以用PRG模式进行处理。