![](/img/trans.png)
[英]ASP.NET textbox losing value after postback when value is changed client-side via javascript
[英]ASP.net: pass dynamically created (by client-side javascript) value along with postback
我有一個執行回發的按鈕,如下所示:
default.aspx
<asp:LinkButton ID="LinkButton1" CssClass="print" runat="server" PostBackUrl="Default.aspx" OnClick="ExportTaxInfoToPDF">Print</asp:LinkButton>
default.aspx.cs
protected void ExportTaxInfoToPDF(object sender, EventArgs e)
{
...
我想將一個javascript計算的值傳遞給$('#taxTable').html()
的代碼(例如$('#taxTable').html()
即我想將該計算的值綁定到EventArgs e
以便可以在服務器端檢索它)我會去做那件事,還是有更好的方法來做到這一點?
謝謝
編輯:
按照山本哲也的建議,我現在有以下代碼:
<asp:HiddenField ID="TaxTableData" runat="server" Value="" />
<asp:LinkButton ID="PrintButton" CssClass="print" runat="server" PostBackUrl="Default.aspx" OnClick="ExportTaxInfoToPDF">Print</asp:LinkButton>
每當使用表格的HTML直接打開包含數據(表格格式)的彈出式窗口時,都會填充TaxTableData:
$("#ctl00_maincontent_TaxTableData").val($table[0].outerHTML);
然后,使用iTextSharp將HTML轉換為PDF。 這是一個簡單的html <table>
:
<table>
<thead>
<th>...</th>
...
</thead>
<tbody>
..
我想知道是否有更好的方法將數據傳輸到服務器端,例如不被迫禁用安全檢查? 有沒有一種方法可以序列化表並在另一側反序列化它?
首先,要將JS值傳遞回發回代碼中,可以使用以下方法設置隱藏的字段服務器控件值:
<!-- ASPX markup -->
<asp:HiddenField ID="TaxTableData" runat="server" Value="" />
<script type="text/javascript">
$('#<%= TaxTableData.ClientID %>').val($table[0].outerHTML); // set hidden field value with table markup
</script>
// Code behind
protected void ExportTaxInfoToPDF(Object sender, EventArgs e)
{
...
var table = this.TaxTableData.Value; // get passed data
...
}
給定從客戶端傳遞的字符串包含HTML表標記,由於存在非法字符,有可能在從隱藏字段進行回發期間引發潛在的危險Request.Form
異常。 為避免這種情況,您可以嘗試以下解決方案之一:
A.禁用請求驗證
在web.config
文件中添加以下行:
<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false" />
另外,在Page
指令中,您需要添加ValidateRequest
屬性:
<%@ Page ValidateRequest="False" %>
這種方法可以平穩地傳遞HTML標記中包含的非法字符,但是它可能帶來與安全相關的問題。
B.使用JSON序列化
可以使用以下方法將HTML標記序列化為JSON格式:
<script type="text/javascript">
$('#<%= TaxTableData.ClientID %>').val(JSON.stringify({ html: $table[0].outerHTML }));
</script>
然后,使用專用字段或Dictionary
類型,將其傳遞給使用隱藏字段值的代碼,並使用JavaScriptSerializer
進行反序列化:
// Code behind
protected void ExportTaxInfoToPDF(Object sender, EventArgs e)
{
...
var serializedTable = this.TaxTableData.Value; // get passed data
// use either dedicated class with SerializableAttribute or Dictionary type
// this example uses Dictionary for simple HTML markups
var serializer = new JavaScriptSerializer();
Dictionary<String, Object> dict = serializer.Deserialize<Dictionary<String, Object>>(serializedTable);
var table = dict["html"].ToString();
...
}
注意:如果提交的HTML標記包含具有單引號或雙引號(例如<table class='example'>
)內的值的屬性,請在設置隱藏字段值之前在客戶端轉義所有引號 (通常在執行JSON.stringify
時會自動完成) JSON.stringify
)。
如果要保留請求驗證設置,以防止在客戶端執行惡意腳本,則首選序列化方法。
相關問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.