2011-03-02 21 views
7

En WebForms de ASP.NET deseo pasar datos arbitrarios de servidor a cliente y viceversa. Estoy serializando a JSON y simplemente he estado produciendo JavaScript que crea el objeto en el cliente. No tengo problemas para enviar datos al servidor con ajax, pero hay situaciones en las que también deseo enviar datos de objetos de Javascript al servidor en devoluciones. Así que supongo que debe estar en un campo oculto.Pasar datos serializados de JSON a través del campo oculto

Un par de preguntas generales sobre esto.

1) ¿Cuál es la mejor manera de hacerlo en términos de minimizar la complejidad y optimizar el espacio y la eficiencia? Al investigar esto descubrí Protocol Buffers pero no parece haber una buena implementación de C#. Encontré uno, pero tenía un par de años y me describí a mí mismo como un buggy, así que eso me asustó.

2) Si acabo de pasar una cadena JSON, ¿cómo puedo estar seguro de que será seguro incluir como valor para un campo oculto? ¿Hay alguna razón por la que no quiera hacer esto? Podría codificar Base64, pero parece que esto agrega mucha sobrecarga. ¿Cuál es considerado el mejor método o el preferido?

+0

¿Por qué no utiliza variables de sesión? (solo curiosidad) –

+0

¿Cómo obtendré esos datos del cliente (en javascript)? –

+0

@Jamietre: Handlers y AJAX, de la misma manera en que lo publicas de nuevo? (ashx/asmx) –

Respuesta

5

En el pasado, he hecho generalmente lo siguiente:

  1. Creado un C# objeto que pueda serializar fácilmente a XML (.Net puede hacer esto de forma nativa y hay serializadores JSON por ahí también) . (De hecho, creo que .Net también puede hacer JSON ... aunque no estoy seguro)
  2. Tome este objeto y compártalo con el cliente a través de un campo oculto o cárguelo en el cliente mediante una solicitud de AJAX.
  3. El cliente luego analiza y manipula el XML (jQuery puede hacer esto) y lo envía de vuelta al servidor a través de AJAX o un campo oculto a través de un POST.
  4. Por último deserializo el XML (o JSON) del cliente a un Objeto y trabajo con él desde allí.

Así que no estoy seguro de lo que intenta obtener a través de la codificación, pero creo que el gasto de transformar el objeto de JSON (o XML) a algo más pequeño es demasiado sobrecargado para cualquier beneficio de embalaje/contracción . (A menos que su un sitio muy alto tráfico preocupa más sobre el uso de ancho de banda que el procesamiento del lado del servidor/cliente.)

Ejemplo

Esperemos que esto le da una idea de cómo lograr esto. Avísame si tienes más preguntas.

<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> 
+0

Esta es básicamente la arquitectura con la que estoy trabajando, ¿tiene alguna sugerencia sobre los detalles de implementación reales para poner los datos en un campo oculto? P.ej. solo pega la cadena JSON justo ahí? ¿Esto no requeriría algún tipo de codificación adicional para estar seguro, p. ¿Qué hay de las citas? ¿Hay otros caracteres que estén bien en JSON pero no en un campo? ¿O base64? Algún otro método? Esto no tiene por qué ser google.com eficiente, pero prefiero comenzar con una buena implementación en lugar de una voluminosa, si hay alguna alternativa. Más o menos a lo que me refería con ProtocolBuffers pero sin C# impl. –

+1

Es posible que desee evitar todo el problema de la codificación al enviar la cadena json al cliente como una variable de JavaScript. es decir. var x = <% = GetJsonString()%>; A continuación, pegue la representación del lado del servidor en el estado de la sesión. Esto te da lo mejor de ambos mundos. No hay posibilidad de alterar la publicación del formulario y no es necesario codificar el JSON. – Tony

+0

@jamietre, ver mi respuesta actualizada. –

Cuestiones relacionadas