【问题标题】:Passing JSON serialized data via hidden field通过隐藏字段传递 JSON 序列化数据
【发布时间】:2011-07-07 14:16:37
【问题描述】:

在 ASP.NET WebForms 中,我想将任意数据从服务器传递到客户端并再次返回。我正在序列化为 JSON,并且一直在简单地生成在客户端上创建对象的 JavaScript。我使用 ajax 向服务器发送数据没有问题,但在某些情况下,我还想在回发时将 Javascript 对象数据发送回服务器。所以我想它需要在一个隐藏的领域。

关于这个的几个一般性问题。

1) 在最小化复杂性和优化空间和效率方面,最好的方法是什么?在对此进行研究时,我发现了Protocol Buffers,但似乎没有一个好的 C# 实现。我确实找到了一辆,但它已经有几年历史了,而且自称是越野车,这让我很害怕。

2) 如果我只是传递一个 JSON 字符串,我如何确定将其作为隐藏字段的值包含在内是安全的?有什么理由我可能不想这样做吗?我可以进行 Base64 编码,但这似乎增加了很多开销。什么被认为是最好的或首选的方法?

【问题讨论】:

  • 你为什么不使用会话变量? (只是好奇)
  • 如何从客户端获取数据(在 javascript 中)?
  • @Jamietre:处理程序和 AJAX,与您将其发回的方式相同吗? (ashx/asmx)
  • Ajax 很好,我想可以在页面发布之前触发 ajax 调用,但如果它仍然被发布,这似乎是不必要的服务器之旅.这是我必须拦截的其他东西。
  • @jamietre:我想在做出判断之前我需要更深入地了解“原始问题”。我可以整天推荐适合您认为合适的方法,但这并不能帮助您解决手头的原始问题。

标签: c# javascript asp.net serialization webforms


【解决方案1】:

过去,我通常会做以下事情:

  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> 

【讨论】:

  • 这基本上是我正在使用的架构,您对将数据放入隐藏字段的实际实现细节有什么建议吗?例如。只是将JSON字符串粘贴在那里?这是否需要某种进一步的编码才能安全,例如报价呢?在 JSON 中可以使用但不是字段的任何其他字符?还是base64?还有什么方法?这不一定是 google.com 高效的,但如果有任何替代方案,我宁愿从一个好的实现开始,而不是笨重的实现。有点像我对 ProtocolBuffers 的理解,但没有 C# impl。
  • 您可能希望通过将 json 字符串作为 javascript 变量发送到客户端来避免整个编码问题。 IE。 var x=;然后将服务器端表示保持在会话状态。这为您提供了两全其美的体验。不会篡改表单帖子,也无需对 JSON 进行编码。
  • JSON.stringify 不是要返回带有双引号的东西吗?我认为这不适用于隐藏字段的值。这真的是我关心的问题。
  • @jamietre,是的,但它们似乎被转义了双引号。如果您尝试上面的示例,您会发现它成功地将 JSON.stringify 的结果分配给隐藏字段,没有任何问题。如果您在 firebug(firefox 浏览器)中查看 DOM,您还可以毫无问题地看到包含双引号的隐藏字段的实际值。
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
相关资源
最近更新 更多