【问题标题】:ASP.net: pass dynamically created (by client-side javascript) value along with postbackASP.net:传递动态创建的(由客户端 javascript)值以及回发
【发布时间】:2017-06-16 09:47:35
【问题描述】:

我有一个按如下方式执行回发的按钮:

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>

只要直接使用表格的 HTML 打开包含数据(表格格式)的弹出窗口,就会填充 TaxTableData:

$("#ctl00_maincontent_TaxTableData").val($table[0].outerHTML);

然后使用 iTextSharp 将 HTML 转换为 PDF。就是一个简单的html&lt;table&gt;:

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

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

【问题讨论】:

  • 您可以使用隐藏字段(普通 HTML input type="hidden" 或 asp:HiddenField 服务器控件)并使用 Request.Form["taxTable"](或 ClientID,如果正在使用服务器控件)来检索客户端值.
  • 谢谢,这成功了。虽然,我在尝试传递 HTML 时遇到错误(从客户端检测到潜在危险的 Request.Form 值)你知道传递 HTML 的最佳方法是什么?
  • 尝试在 Web 配置中使用 &lt;httpRuntime requestValidationMode="2.0" /&gt; 和 &lt;pages validateRequest="false" /&gt;,在 ASPX 页面中使用 &lt;%@ Page ValidateRequest="false" %&gt;。哪个字符触发了Request.Form 错误?
  • 感谢您的帮助。这行得通。我猜是&lt; 字符(错误消息说:&lt;table style="...)。首先传递 html 可能是个坏主意,但暂时禁用此检查即可。
  • 我更喜欢将 HTML 标记转换为其他格式(例如 JSON),然后将其传递到后面的代码中以防止出现Request.Form 错误,然后在流程逻辑中序列化接收到的数据并随后呈现结果。您可以编辑问题以提供您想要传递的数据格式,我可以在详细答案中提供执行此操作的步骤。

标签: javascript c# asp.net postback


【解决方案1】:

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

然后,使用隐藏字段值将其传递到代码后面,并使用JavaScriptSerializer 对其进行反序列化,使用专用类或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 标记包含值在单引号或双引号内的属性(例如 &lt;table class='example'&gt;),则在客户端设置隐藏字段值之前 escape all quote marks(通常在执行 JSON.stringify 时自动完成)。

如果您想保留请求验证设置,防止恶意脚本在客户端执行,则首选序列化方法。

相关问题:

  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

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多