ASP.net:传递动态创建(通过客户端javascript)值以及回发

时间:2017-01-31 03:59:06

标签: javascript c# asp.net 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>

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

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

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

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

我想知道是否有更好的方法将数据传输到服务器端,以免被迫禁用安全检查?有没有办法序列化表并在另一侧反序列化它?

1 个答案:

答案 0 :(得分: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异常。为避免这种情况,您可以尝试以下解决方案之一:

:一种。禁用请求验证

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标记在设置隐藏字段值之前在客户端包含单引号或双引号内的值(例如<table class='example'>),escape all quote marks的属性(通常在执行时自动完成{ {1}})。

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

相关问题:

  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