我有一个执行回发的按钮,如下所示:
的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>
..
我想知道是否有更好的方法将数据传输到服务器端,以免被迫禁用安全检查?有没有办法序列化表并在另一侧反序列化它?
答案 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}})。
如果您希望保留请求验证设置,防止恶意脚本在客户端执行,则首选序列化方法。
相关问题: