2

いくつかの HTML テーブルがあり、jQuery を使用して行を 1 つの HTML テーブルから別のテーブルに移動/シャッフルしています。シャッフルが完了したら、次のページで取得できるように、これらのテーブルをサーバー側 (できればセッション) に保存する方法を見つける必要があります。

最初のステップとして、変更された DOM を ASP.NET Textbox に保存して、html 全体を ASP.NET 側に移動できるようにしました (そして、VB.NET コードを使用して処理し、セッション/キャッシュに保存します)。

var html = $('html').clone();
var htmlString = html.html();

$('#TextBox1').val(htmlString); 

しかし、次のエラーが発生する最初のステップで立ち往生しています

「潜在的に危険なRequest.Form値がクライアントから検出されましたTextBox1 ...

ASP.NET を使用してそれらを読み取って処理できるように、これらの HTML テーブルをサーバー側に保存する方法を教えてください。代わりに JSON を探す必要がありますか?

4

4 に答える 4

2

テーブルのデータをサーバーに投稿することが目標の場合、通常、テーブルの行をオブジェクトに変換し、ajax() を介してデータを JSON として投稿します。ユーザーがポストバックまたはその他のイベントをトリガーするボタンを押したときに、これを自動的にトリガーするクリック イベントを追加できます。

例:

クライアント側

    // Wire up posting the data to the server with a ASP.NET button
    $('#<%= Save.ClientID %>').click(function (e) {
        PostTable();
    });


    // Read a row
    function GetRow(rowNum) {
        var tableRow = $('#partTable tbody tr').eq(rowNum);

        var row = {};

        row.ChangeType = tableRow.find('td:eq(1)').text();
        row.UpdateType = tableRow.find('td:eq(2)').text();
        row.Part = tableRow.find('td:eq(5)').text();
        row.Price = tableRow.find('td:eq(7)').text();
        row.UOM = tableRow.find('td:eq(8)').text();
        row.ApplyDate = tableRow.find('td:eq(9)').text();
        row.Remarks = tableRow.find('td:eq(10)').text();

        return row;
    }

    // Read all rows
    function GetAllRows() {
        var dataRows = [];

        $('#partTable tbody tr').each(function (index, value) {
            var currentRow = GetRow(index);
            dataRows.push(currentRow);
        });

        return dataRows;
    }

    // POST rows to server
    function PostTable() {
        var crossId = getParameterByName('id');
        var jsonRequest = { rows: GetAllRows(), crossId: crossId };

        $.ajax({
            type: 'POST',
            url: 'TableProcessingViajQueryAjax.aspx/SaveRows',
            data: JSON.stringify(jsonRequest),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            async: false,
            success: function (data, text) {
                return true;
            },
            error:function (request, status, error){
                return false;
            } 

サーバ側

    [WebMethod]
    public static bool SaveRows(List<Row> rows, int crossId)
    {
        // Do something with your data, maybe put in session/cache/db/etc...
    } 

サーバー側 (オブジェクトは JS で作成されたオブジェクトと一致する必要があります)

public class Row
{
    public string ChangeType { get; set; }
    public string UpdateType { get; set; }
    public string Part { get; set; }
    public double Price { get; set; }
    public int UOM { get; set; }
    public DateTime ApplyDate { get; set; }
    public string Remarks { get; set; }
}

** JSON.ORG の「stringify」を使用して、オブジェクトを有効な JSON オブジェクトに変換しています。

于 2012-07-24T15:13:20.667 に答える
1

リクエストの検証を無効にせずにこれを回避する 1 つの方法は、HTML データを、ASP.NET が潜在的な危険なリクエストとして検出しないものにエンコードすることです。そのようなオプションはbase64エンコーディングです。

あなたはすでにjqueryを使用しているので; 多くのbase64プラグインの1つを使用して、htmlを簡単に取得してエンコードできます(1つの例はこちら)。

今あなたがする必要があるのは次のことだけです:

$('#TextBox1').val(base64encodedhtmlString);

そして、サーバー側で次のように変換します。

string encodedstring = ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(text.Text));

ページが次のように utf-8 エンコーディングを使用していると仮定します<meta charset="utf-8">

:この「解決策」はハックです。このようなことをせずに必要なことを行うための代替手段を探します。臭い。

更新

jsfiddleを追加します。「リソースの管理」セクションに注意してください。上記でリンクしたプラグインを使用しています。

この例の出力 ( PHRhYmxlIGlkPSJzb21ldGFibGUiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjIiPgogIDx0Ym9keT48dHI+CiAgICAgPHRkPmJsYWg8L3RkPgogICAgIDx0ZD5ibGFoPC90ZD4KICAgICA8dGQ+YmxhaDwvdGQ+CiAgIDwvdHI+CjwvdGJvZHk+PC90YWJsZT4=) をここでデコードして、元の html が実際に含まれていることを確認できます。

于 2012-07-24T14:38:58.737 に答える
0

あなたはこの解決策に従うことができます:

<%@ Page Language="C#" ValidateRequest="false" %>

ただし、リクエストを検証して、潜在的に危険なリクエストを確認してください。これも読むことができます。

于 2012-07-24T14:03:03.897 に答える
0

TextBox の代わりに HiddenField を使用してみましたか? HiddenField で「潜在的に危険な Request.Form 値」を取得したかどうか思い出せません。多分今でもあると思います。

とにかく、HTML テーブルのコードを送信しようとする代わりに、JSON を使用してみます (サーバー側での解析がより困難になります)。HTML テーブルを直接変更する代わりに、jQuery を使用してデータを操作し、javascript 変数 (オブジェクトの配列?) に保存できます。次に、それらの変数に基づいて HTML テーブル表示を再構築します。

クライアント上のデータを JSON (JSON.stringify) としてシリアル化し、HiddenField でサーバーに送信できます。次に、サーバー上で JavaScriptSerializer を使用してデシリアライズし、サーバー上でそのデータを処理できます。別のページで、別の HiddenField を作成し、JavaScriptSerializer を使用してデータを HiddenField にシリアライズすることができます。その後、クライアント コードは JSON を逆シリアル化して変数に読み込まれたデータを取得し、それらの変数を使用して HTML テーブル表示を再構築できます。

JSON2 の例...

// Serialize
var value_for_hidden_field = JSON.stringify(my_js_variable);  
$("#HiddenField1").val(value_for_hidden_field); 

// Deserialize
var my_js_variable = JSON.parse($("#HiddenField1").val());

ASP.Net の例...
データを処理するために設定したクラスを使用する必要があるため、これは非常に単純化されていますが、呼び出すメソッドの一般的なアイデアが得られます。

' Deserialize
Dim jss As New System.Web.Script.Serialization.JavaScriptSerializer
Dim json_x  = jss.Deserialize(Of YourClassName)(HiddenField1.Value)

' Serialize
Dim jss As New System.Web.Script.Serialization.JavaScriptSerializer
Dim json_x As New YourClassName = GetYourData() ' Returning appropriate object
HiddenField1.Value = jss.Serialize(json_x)
于 2012-07-24T14:11:16.367 に答える