2017-01-31 14 views
0

У меня есть кнопка, которая выполняет обратную передачу следующим образом:ASP.net: пропуск созданы динамически (по яваскрипту стороны клиента) значение наряду с постбэк

default.aspx

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

по умолчанию .aspx.cs

protected void ExportTaxInfoToPDF(object sender, EventArgs e) 
{ 
    ... 

Я хочу передать яваскрипт вычисленного значение в код (например, $('#taxTable').html() т. Е. Я хочу привязать значение этого вычисления к EventArgs e, чтобы я мог получить его на стороне сервера). Как я могу это сделать или есть лучший способ достичь этого?

Спасибо

EDIT:

После предложения Tetsuya Ямамото, теперь у меня есть следующий код:

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

TaxTableData заполняемый всякий раз, когда всплывающее окно, содержащее данные (в виде таблицы) является открыто с использованием непосредственно таблицы HTML:

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

HTML затем преобразуется в PDF с использованием iTextSharp. Это простой HTML <table>:

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

мне интересно, если есть более эффективные способы передачи данных на стороне сервера, например, не будут вынуждены отключить проверку безопасности? Есть ли способ сериализовать таблицу и неэтериализовать ее с другой стороны?

+1

Вы можете использовать скрытое поле (ванильный HTML 'input type =" hidden "или' asp: HiddenField' серверный контроль) и использовать 'Request.Form [" taxTable "]' (или 'ClientID', если серверный контроль используется) для извлечения значения на стороне клиента. –

+0

Спасибо, это сработало. Хотя, я получаю сообщение об ошибке при попытке передать HTML, как мне нужно (* потенциально опасное значение Request.Form было обнаружено у клиента *) Знаете ли вы, что было бы лучшим способом передать HTML? –

+1

Попробуйте использовать '' с '<страницы validateRequest =" false "/>' в веб-конфигурации и '<% @ Page ValidateRequest =" false "%>' на странице ASPX. Какой символ вызвал ошибку 'Request.Form'? –

ответ

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-таблицы разметок, можно бросить потенциально опасное исключение во время обратной передачи из скрытого поля из-за наличия незаконных символов. Чтобы избежать этого, вы можете попробовать один из приведенных ниже решений:

A. проверки Отключить запрос

Добавьте эти строки в web.config файле:

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

Кроме того, в Page директивы вам нужно add ValidateRequest атрибут:

<%@ Page ValidateRequest="False" %> 

Этот способ позволяет незаконный charac которые включены в 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(); 
    ... 
} 

NB: Если представленный HTML разметка содержит атрибут со значениями внутри одинарных или двойных кавычек (например <table class='example'>), 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

 Смежные вопросы

  • Нет связанных вопросов^_^