Передача сериализованных данных JSON через скрытое поле - PullRequest
7 голосов
/ 02 марта 2011

В ASP.NET WebForms я хочу передать произвольные данные с сервера на клиент и обратно. Я сериализуюсь в JSON и просто создаю JavaScript, который создает объект на клиенте. У меня нет проблем с отправкой данных на сервер с помощью ajax, но бывают ситуации, когда я также хочу отправить данные объекта Javascript обратно на сервер при обратной передаче. Я думаю, это должно быть в скрытом поле.

Пара общих вопросов по этому поводу.

1) Каков наилучший способ сделать это с точки зрения минимизации сложности и оптимизации пространства и эффективности? При исследовании этого я обнаружил протокольные буферы , но, похоже, нет хорошей реализации C #. Я нашел один, но это было пару лет, и он назвал себя глючным, так что меня это напугало.

2) Если я просто передам строку JSON, как я могу быть уверен, что будет безопасно включать в качестве значения скрытое поле? Есть ли причина, по которой я не хочу этого делать? Я мог бы кодировать Base64, но, похоже, это добавляет много накладных расходов. Какой метод считается лучшим или предпочтительным?

1 Ответ

5 голосов
/ 03 марта 2011

В прошлом я обычно делал следующее:

  1. Создал объект C #, который можно легко сериализовать в XML (.Net может делать это изначально, и существуют сериализаторы JSON какЧто ж).(На самом деле я думаю, что .Net может также выполнять JSON ... хотя и не уверен)
  2. Возьмите этот объект и поделитесь им с клиентом через скрытое поле или лениво загрузите его на клиенте с помощью запроса AJAX.
  3. Затем клиент анализирует и обрабатывает XML (jQuery может сделать это) и отправляет его обратно на сервер через AJAX или скрытое поле через POST.
  4. Наконец, я десериализирую XML (или JSON) с клиента обратно в Object и работаю с ним оттуда.

Так что я не уверен, что вы пытаетесь получить с помощью кодирования, но я думаю, что затраты на преобразование объекта из JSON (или XML) во что-то меньшее слишком много для любой упаковки/ сокращающаяся выгода.(Если ваш сайт со сверхвысоким трафиком не заботится больше об использовании полосы пропускания, чем об обработке на стороне сервера / клиента.)

ПРИМЕР

Надеюсь, это даст вам представление о том, как достичьэтот.Позвольте мне знать, если у вас есть еще вопросы.

<html> 
<head> 
</head> 
<body> 
    <input type="button" id="btnObject" value="Show Object" /> 
    <input type="button" id="btnShowHid" value="Show Hidden Input Value" /> 
    <input type="hidden" id="hidInput" value="" /> 
</body> 
</html> 
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js'></script>
<script type='text/javascript' src='https://github.com/douglascrockford/JSON-js/raw/master/json2.js'></script> 
<script> 
    //Your JSON Object
    var myJSONObject = {"bindings": [ 
            {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}, 
            {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"}, 
            {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"} 
        ] 
    }; 

    //jQuery Document Ready Event
    $(function(){
         //Get a reference to your hidden field
        var $hidInput = $("#hidInput");

        //Use json2.js library to convert the json object to a string
        //and assign it to the hidden input's value
        //NOTE: ASP.NET hidden input control reduces to a hidden input so you can treat them the same.
        $hidInput.val(JSON.stringify(myJSONObject));

        //Set up click events to view object and hidden value
        $("#btnShowHid").click(function(){
            alert($hidInput.val());
        });

        $("#btnObject").click(function(){
            alert(myJSONObject);
        });

    });
</script> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...