ASP.NET - 不使用 ServerControl 傳值到後端
PostBack如何運作的?
ASP.NET Webform會自動Render出一段ASP.NET產生的JavaScript:
1
2
3
4
5
6
7 function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
- eventTarget: PostBack是由哪一個物件所觸發的。
- eventArgument:觸發PostBack時,想要帶回去的argument值。
練習
.aspx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <script>
var DO_POSTBACK = function () {
var myText = document.getElementById('text').value;
var obj = {
Para: myText,
};
var myJson = JSON.stringify(obj);
__doPostBack('btn', myJson);
}
</script>
<body>
<form id="form1" runat="server">
<div>
<input type="text" id="text" />
<input type="button" value="click" onclick="DO_POSTBACK()" />
</div>
</form>
</body>
.cs
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 protected void Page_Load(object sender, EventArgs e) {
if ( IsPostBack ) {
//控制項ID
string myTarget = Request.Params["__EVENTTARGET"];
//PostBack參數
string myArgs = Request.Params["__EVENTARGUMENT"];
if ( myArgs != null ) {
System.Web.Script.Serialization.JavaScriptSerializer objSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
ParaClass obj = objSerializer.Deserialize<ParaClass>(myArgs);
Response.Write(obj.Para);
}
}
}
public class ParaClass {
public string Para { get; set; }
public ParaClass() {
Para = string.Empty;
}
}
曾遇到在Local端測試沒有問題,但是放到線上之後仍然無法POSTBACK的狀況,是因為沒有__doPostBack 的JS Function,需加入
<asp:LinkButton>
才會產生
<asp:LinkButton>
其實最後輸出的是一個<a>
的 html tag,因為<a>
其實無法做Postback的動作,所以會產生一個 __doPostBack 的 JS function