首先先看一下Asp.net在Client是怎麼進行這件事,我們新增一webform.aspx,把他執行起來,檢視原始碼,可以看到以下的原始碼:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
</title></head>
<body>
<form method="post" action="WebForm1.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="dy3kcX7QV0Js29tZUx4q0IjbXNujnTRE
+7hGeJZAAnH1+Gd0uF0Axo1b63XY+m7q+wZMmXwkp7I3pzAum1bSk/6UyeAKMj5iWnPUDshfrDE=" />
</div>
<script type="text/javascript">
//<![CDATA[
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>
</form>
</body>
</html>
上面的程式碼,postback主要是靠__doPostBack,這個function,所以我們想辦法要呼叫這個 function, 這function 的第一個參數是啟動postback的Control ID,第二個是參數,可以不傳,有傳的話,會傳到code behind對應的method。
所以我們在code behind 註冊一段呼叫__postback的javascript,ASP.NET提供了ClientScript.GetPostBackEventReference這簡便的method用:
using System;
using System.Text;
namespace WebforcwPostBack2
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
prepareForcePostback();
if (Page.IsPostBack)
Response.Write("PostBack!!");
}
void prepareForcePostback()
{
StringBuilder sbScript = new StringBuilder();
sbScript.Append("<script language='JavaScript' type='text/javascript'>\n");
sbScript.Append("function forcePostback() {");
sbScript.Append("<!--\n");
//呼叫 __doPostBack, 第一個參數傳入啟動Postback的Contol, 這邊給this, 表示整個Page作Postback
sbScript.Append(ClientScript.GetPostBackEventReference(this, "PBArg") + ";\n");
sbScript.Append("// -->\n");
sbScript.Append("}");
sbScript.Append("</script>\n");
ClientScript.RegisterStartupScript(Page.GetType(),
"AutoPostBackScript", sbScript.ToString());
}
}
}
註冊好的function,我們在aspx 拉一個Html button,在其onclick,作一alert,並呼叫forcePostback
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebforcwPostBack2.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<br />
<input id="Button2" type="button" value="button" onclick="alert('hi');forcePostback();"/></div>
</form>
</body>
</html>
到這裡就大功告成了
另外在Ajax環境下,如果你是利用windows.open一個視窗,選完資料後,要觸發所更新欄位的事件,可以加入以下Javascript,在window.close後可以觸發__doPostback
window.onunload = function (e) { opener.somefunction();
opener.__doPostBack ('txtBox','');;
};
參考
Doing or Raising Postback using __doPostBack() function from Javascript in Asp.Net
Trigger postback on code-behind
沒有留言:
張貼留言