接續前一篇不關閉validateRequest下允許傳送XML內容的議題,有人問起,我才想到該文只示範了AJAX做法,壓根忘了提WebForm環境下應如何處理。

以下是我會採用的處理方式。原理上還是透過encodeURIComponent()及HttpUtility.UrlDecode()分別在Client端與Server端加解碼,只是要額外動些手腳:

  1. 在網頁上放一個<asp:HiddenField>作為實際的傳值容器。
  2. 供使用者輸入的<textarea>或<input type="text">定義成純Client端元素,並記得只指定id,不要指定name屬性,不然它會一併被Postback引發檢核錯誤,徒增麻煩。
  3. 在表單的Client onsubmit事件中,取出textarea內容,經encodeURIComponent()後存入<asp:HiddenField>中,接著就可以放心送出表單囉!
  4. Server端在IsPostBack時用HttpUtility.UrlDecode(theHiddenField.Value)就能輕鬆取值。

以下是程式範例:

<%@ Page Language="C#" %>
<!DOCTYPE>
 
<script runat="server">
    void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            Response.ContentType = "text/plain";
            Response.Write("Data=" + HttpUtility.UrlDecode(hdnXml.Value));
            Response.End();
        }
    }
</script>
 
<html>
<head runat="server">
    <title>MyLab</title>
    <style>
        body,input { font-size: 9pt; }
    </style>
    <script src='http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.js'></script>   
    <script>
        $(function () {
            $("#txtXml").text("<data>Text</data>");
            //掛上onsubmit事件,表單送出前,將textarea的內容編碼後寫入hidden
            $("#form1").submit(function () {
                $("#hdnXml").val(encodeURIComponent($("#txtXml").text()));
            });
        });
    </script>
 
</head>
<body>
    <form id="form1" runat="server">
    <!--用純Client端的textarea或input讓使用者輸入XML,
        記得只設id,不要設name,以免PostBack時被一併送回-->
    <textarea id="txtXml" cols="20" rows="4">
    </textarea><br />
    <asp:HiddenField ID="hdnXml" runat="server" EnableViewState="false"/>
    <asp:Button ID="btnSubmit" runat="server" Text="Submit" />
    </form>
</body>
</html>

PS: 當然,你也可選擇不另增設HiddenField,直接在onsubmit時取出<textarea>內容,encodeURIComponent()後再寫回<textarea>。不過省下這點工,卻必須面對使用者回上頁時<textarea>變成編碼後內容的燙手山芋,個人認為並不划算,建議別自找麻煩。


Comments

Be the first to post a comment

Post a comment