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 中执行恶意脚本。
相关问题:
Passing values from javascript to code behind in ASP.NET
A potentially dangerous Request.Form value was detected from the client
How to pass JSON data to code behind method (not to Webmethod)?
Deserialize JSON String in code behind
我有一个执行回发的按钮,如下所示:
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 中执行恶意脚本。
相关问题:
Passing values from javascript to code behind in ASP.NET
A potentially dangerous Request.Form value was detected from the client
How to pass JSON data to code behind method (not to Webmethod)?
Deserialize JSON String in code behind