ASP.NET\ASP.NET MVC表单提交遇到的问题结论
同步提交的两种基本方式
1,用type=“submit”按钮。form没有必要runat=“server”
1 2 3 4 5 | <form method= "post" action= "SubmitForm.aspx" > id:<input type= "text" id= "txtId" name= "txtId" /><br /> name:<input type= "text" id= "txtName" name= "txtName" /><br /> <input type= "submit" value= "提交" /> </form> |
2,用type=“button”。form没有必要runat=“server”
javascript方式提交,不能type=“submit”:会造成想不到的问题。
1 2 3 4 5 6 7 8 9 10 | <script> onload = function () { document.getElementById( 'btnsub' ).onclick = function () { var frm = document.getElementById( 'frm' ); if (frm) { frm.submit(); } } } </script> |
1 2 3 4 5 | <form id= "frm" method= "post" action= "SubmitForm.aspx" > id:<input type= "text" id= "txtId" name= "txtId" /><br /> name:<input type= "text" id= "txtName" name= "txtName" /><br /> <input type= "button" id= "btnsub" value= "提交" /> </form> |
注意:上述提交方式:form中没有隐藏域,后置代码中的ispostback永远为false。
所以这些客户端控件提交,假使没有自己写viewstate,后置代码是不能用到ispostback。当然我们可以模拟隐藏域。
如果想使用ispostback,更为方便的方式,用form runat=“server”的表单。
runat=“server”提交
1,form runat=“server”创建隐藏域,方便使用ispostback
1 2 3 | <form id= "form1" runat= "server" > <input id= "btnsub" type= "button" name= "name" value= "提交" /> </form> |
对应的源代码
1 2 3 4 5 6 7 8 9 10 11 | < form method="post" action="SubmitDemo4.aspx" id="form1"> < div class="aspNetHidden"> < input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTEzNDM3NzkxOWRkFhrJ2htKdbAXWvYaKqbSR1DlJxfnPlLSZZ+sg4QDkgo=" /> </ div > < div class="aspNetHidden"> < input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="1D64C812" /> </ div > < input id="btnsub" type="button" name="name" value="提交" /> </ form > |
type=“button”的form,我们只能用javascript来提交。
1 2 3 4 5 6 7 8 9 10 11 | <script> onload = function () { document.getElementById( 'btnsub' ).onclick = function () { var frm = document.getElementById( 'form1' ); if (frm) { frm.submit(); } } } </script> |
后置代码中可以用到ispostback,首次加载ispostback为false,post之后(点击按钮后)ispostback为true
1 2 3 4 5 6 7 8 9 10 11 | protected void Page_Load( object sender, EventArgs e) { if (IsPostBack) { var txtId = Request.Form[ "txtId" ] ?? string .Empty; var txtName = Request.Form[ "txtName" ] ?? string .Empty; Response.Write(txtId + txtName); Response.End(); } } |
在后置代码中,我们可以用ispostback,首次加载为false,post之后为true。
注意:form的runat=“server”属性,帮我们做到的功能:加上隐藏域input type="hidden" name="__VIEWSTATE"和__VIEWSTATEGENERATOR
其中__VIEWSTATE就是后置代码ispostback判断真假的本质。
页面首次加载,为get请求,__VIEWSTATE的input值不会被传递到后置代码中。
当post提交时候,它会被提交到后台,我们只需在后置代码中检测这个input的值是否存在,不存在即是get请求,当然一般是首次加载,存在变是post回传过来的。
2,runat=“server”的第二个目的,在服务端拿到这个控件
它的目的:在后置代码中,我们可以直接访问并处理到对应的id的这个控件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | < script > onload = function () { document.getElementById('btnsub').onclick = function () { var frm = document.getElementById('<%= formclientID%>'); if (frm) { frm.submit(); } } } </ script > < form id="form1" runat="server"> < div > < input type="button" id="btnsub" name="name" value="提交" runat="server" /> </ div > </ form > |
后置代码 :aspx和aspx.cs文件是继承的关系,我们在后置代码(基类)中定义一个变量为protect级别,这样页面可以拿到这个变量。
1 2 3 4 5 6 7 8 9 | public partial class runatserver : System.Web.UI.Page { protected string formclientID = string .Empty; protected void Page_Load( object sender, EventArgs e) { formclientID = form1.ClientID; btnsub.Value = "改过的提交" ; } } |
页面显示,显示的是在后置代码中被更改后的值,并非HTML中设置的value
服务器控件提交
也许你会用到服务器控件button,记得它一定在form runat=“server”中,否则报错。类型“Button”的控件“Button1”必须放在具有 runat=server 的窗体标记内。
1 2 3 | < form id="form1" runat="server"> < asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> </ form > |
页面源代码
1 2 3 4 5 6 7 8 9 10 11 12 | < form method="post" action="ServerControl.aspx" id="form1"> < div class="aspNetHidden"> < input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTI0MTIwNDkwOWRk+uzHYLaWkTZXq5gbvwWQqLnBhSG8yeCI0Y0ZfO3Uiao=" /> </ div > < div class="aspNetHidden"> < input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="75E12176" /> < input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAKMxJZ3e2e2T+pTyw/bgzf8zfg78Z8BXhXifTCAVkevd9GccaPBHHKDYQmgMf9k8Rs3iGzmicl8nAyLMrUQxTTv" /> </ div > < input type="submit" name="Button1" value="Button" id="Button1" /> </ form > |
注意:本质是服务器button在页面生成HTML:type=“submit”也就是我们上文提到的基本的提交方式第一种,如上文讲到我们可以在后置代码中拿到这个id。
有了runat=“server”属性为什么还要有服务器控件?
比如
1 | < asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> |
在设计中点击之后,直接转到后置代码,创建click事件处理代码。
1 2 3 4 | protected void Button1_Click( object sender, EventArgs e) { //Response.Write("y"); } |
asp.net jQuery.ajax异步提交表单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <script src= "js/jquery-1.4.1.min.js" ></script> <script> $(function () { $( "#btnsub" ).click(function () { $.ajax({ type: "post" , url: "AsynSubmit.aspx/Page_Load" , //data: { username: $("#username").val(), content: $("#content").val() }, data:$( "#form1" ).serialize(), success: function (data) {<br> alert(data); } }) }) }) </script> |
1 2 3 4 5 | < form id="form1" runat="server"> id:< input type="text" name="textID" value=" " />< br /> Name:< input type="text" name="textName" value=" " />< br /> < input id="btnsub" type="button" name="btnsub" value="异步提交" /> </ form > |
后置代码
1 2 3 4 5 6 7 | if (IsPostBack) { string id=Request.Form["textID"]??string.Empty; string Name=Request.Form["textName"]??string.Empty; Response.Write(id + Name); Response.End(); } |
注意:Response.End()的使用,不让其返回其他流,只返回指定的数据就ok。因为默认会返回整个页面的html。
如何判断一个请求是不是异步
第一个方法:请求的时候看浏览器的刷新按钮,是否刷新。
第二个方法:查看这次请求的请求头是否包含X-Requested-With:XMLHttpRequest,如果请求头部还有这个标示,表示这次请求为异步请求。
不小心造成的问题 用到ajax,但是提交按钮写成了type=“submit”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | < html xmlns="http://www.w3.org/1999/xhtml"> < head runat="server"> < meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> < title ></ title > < script src="js/jquery-1.4.1.min.js"></ script > < script > $(function () { $("#btnsub").click(function () { alert(1); $.ajax({ type: "post", url: "AsynSubmit.aspx/Page_Load", //data: { username: $("#username").val(), content: $("#content").val() }, data:$("#form1").serialize(), success: function (data) { $("#idd").text(data); } }) }) }) </ script > </ head > < body > < form id="form1" runat="server"> id:< input type="text" name="textID" value=" " />< br /> Name:< input type="text" name="textName" value=" " />< br /> < input id="btnsub" type="submit" name="btnsub" value="异步提交" /> </ form > < div id="idd" style="width:200px;height:200px;background:red;"></ div > </ body > </ html > |
后置代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | protected void Page_Load( object sender, EventArgs e) { int count = 0; if (IsPostBack) { count++; string xrequest = Request.Headers[ "X-Requested-With" ]; if (xrequest != null ) { string id = Request.Form[ "textID" ] ?? string .Empty; string Name = Request.Form[ "textName" ] ?? string .Empty; Response.Write(id + Name); //Response.End();//注意这个使用,不让其返回整个页面HTML } else { Response.Write( "同步" ); } } } |
注意+问题,求这个答案
后置代码中打上断点调试的过程中,并不是按照从上到下的执行,有时候会从下向上执行~~~因为同时发出了异步请求和同步请求,两个请求同时到达。程序就出现紊乱。程序中的xrequest != null执行,表示请求是异步的。这样便没有什么意义。这种紊乱谁能解释一下吗?
MVC提交表单
同步提交(页面刷新)
1 2 3 4 | @ using (Html.BeginForm()) { <input type= "text" name= "name" value= " " /> <input type= "submit" value= "提交" /> } |
页面源代码
1 2 3 | <form action= "/Form/index" method= "post" > <br> <input type= "text" name= "name" value= " " /> <input type= "submit" value= "提交" /> </form> |
异步提交(请求头也含有X-Requested-With:XMLHttpRequest)
1,引入隐士ajax脚本
2,表单里面的提交按钮一定type=“submit”,否则没有作用的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <script src= "~/Scripts/jquery-1.7.1.js" ></script> <script src= "~/Scripts/jquery.unobtrusive-ajax.js" ></script> <script> function success(data) { alert(data) } </script> @ using (Ajax.BeginForm( new AjaxOptions(){Confirm= "ddddd" , HttpMethod= "post" , OnSuccess= "success" })) { <input type= "text" name= "name" value= " " /> <input type= "submit" value= "提交" /> } |
页面源代码
1 2 3 | <form action= "/Form/index" data-ajax= "true" data-ajax-confirm= "ddddd" data-ajax-method= "post" data-ajax-success= "success" id= "form0" method= "post" > <input type= "text" name= "name" value= " " /> <input type= "submit" value= "提交" /> </form> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?