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() 即我想将该计算值绑定到 EventArgs e 以便我可以在服务器端)我该怎么做,或者有更好的方法来实现吗?

谢谢

编辑:

根据 Tetsuya Yamamoto 的建议,我现在有以下代码:

<asp:HiddenField ID="TaxTableData" runat="server" Value="" />
<asp:LinkButton ID="PrintButton" CssClass="print" runat="server" PostBackUrl="Default.aspx" OnClick="ExportTaxInfoToPDF">Print</asp:LinkButton>

只要直接使用 table:

的 HTML 打开包含数据(table 格式)的弹出窗口,就会填充 TaxTableData
$("#ctl00_maincontent_TaxTableData").val($table[0].outerHTML);

然后使用 iTextSharp 将 HTML 转换为 PDF。这是一个简单的 html <table>:

<table>
<thead>
<th>...</th>
...
</thead>
<tbody>
..

我想知道是否有更好的方法将数据传输到服务器端,例如不被强制禁用安全检查?有没有办法序列化 table 并在另一端反序列化它?

首先,要在回发时将 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
    ...
}

鉴于从 client-side 传递的字符串包含 HTML table 标记,由于存在,在从隐藏字段回发期间可能会抛出潜在的危险 Request.Form 异常的非法字符。为避免它,您可以尝试以下解决方案之一:

一个。禁用请求验证

web.config 文件中添加这些行:

<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false" />

此外,在 Page 指令中您需要添加 ValidateRequest 属性:

<%@ Page ValidateRequest="False" %>

这种方式允许 HTML 标记中包含的非法字符顺利通过,但是它可能会造成 security-related 问题。

乙。使用JSON序列化

可以使用此方法将 HTML 标记序列化为 JSON 格式:

<script type="text/javascript">
    $('#<%= TaxTableData.ClientID %>').val(JSON.stringify({ html: $table[0].outerHTML }));
</script>

然后,使用隐藏字段值将其传递到代码后面并使用 JavaScriptSerializer 对其进行反序列化,使用专用 class 或 Dictionary 类型:

// 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'>),escape all quote marks 在 client-side 之前设置隐藏字段值(通常它在执行 JSON.stringify 时自动完成)。

如果您想保留请求验证设置,则首选序列化方法,以防止在 client-side 中执行恶意脚本。

相关问题:

  1. Passing values from javascript to code behind in ASP.NET

  2. A potentially dangerous Request.Form value was detected from the client

  3. How to pass JSON data to code behind method (not to Webmethod)?

  4. Deserialize JSON String in code behind