簡體   English   中英

ASP.net:傳遞動態創建的(通過客戶端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 )。

如果要保留請求驗證設置,以防止在客戶端執行惡意腳本,則首選序列化方法。

相關問題:

  1. 將JavaScript中的值傳遞給ASP.NET中的代碼

  2. 從客戶端檢測到潛在的危險Request.Form值

  3. 如何將JSON數據傳遞給方法后面的代碼(而不是Webmethod)?

  4. 在后面的代碼中反序列化JSON字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM