2010-03-11 23 views
54

En mi situación particular, tengo un par de soluciones a mi problema. Quiero saber cuál es más factible. En este caso, también puedo lograr mi objetivo devolviendo un objeto JSON desde mi código del lado del servidor; sin embargo, no sé cómo se hace y cuál es la mejor manera de hacerlo.Devolver objeto JSON desde una página ASP.NET

En primer lugar, no necesito una página completa de aspx ya que solo necesito una respuesta devuelta del código. Entonces, ¿uso servicios web, un controlador o hay alguna otra forma específica de hacerlo?

¿Es factible esta solución? ¿Construyo la cadena JSON usando la clase StringBuilder e inyecto esa cadena en la página aspx de destino? ¿Hay alguna precaución o cosas de las que deba tener conocimiento?

Agradezco sus ideas.

Saludos,

Kemal

------------ ACTUALIZACIÓN! ------------

Supongamos que tengo un objeto JSON en mi página userlist.aspx, que luego utilizo con jQuery ...

{"menu": { 
    "id": "color1", 
    "value": "color", 
    "popup": { 
    "menuitem": [ 
     {"value": "Red"}, 
     {"value": "Green"}, 
     {"value": "Yellow"} 
    ] 
    } 
}} // example taken from the json.org/example page 

Ahora cuando quiero añadir nuevos elementos de menú de mi página aspx, ¿qué hago ... creo de esta manera mi questi es más específico ...

Supongamos que creo una nueva cadena en mi código aspx, como tal "{"value": "Blue"}. ¿Cómo puedo inyectar esto en la lista de elementos ya existente en la página de destino? ¿O este no es el enfoque correcto para este tipo de situación? Si no, ¿de qué otro modo se puede lograr?

Además, si deseo activar un evento jQuery cuando se agrega un nuevo elemento a esta lista, ¿cómo se logra esto?

------------ ACTUALIZACIÓN 2 el 26 de agosto el año 2015 ------------

el momento en que esta pregunta, el camino Me estaba acercando al problema en otro aspecto. Ahora soy más competente en el tema y puedo aceptar con mucho gusto la respuesta más votada ya que el enfoque de esta pregunta claramente no debe incluir el JSON ya existente y generar uno nuevo del código como también sugiere @DavGarcia.

Respuesta

108

En su Page_Load que va a querer limpiar la salida normal y escribir su propio, por ejemplo:

string json = "{\"name\":\"Joe\"}"; 
Response.Clear(); 
Response.ContentType = "application/json; charset=utf-8"; 
Response.Write(json); 
Response.End(); 

para convertir un objeto de C# para JSON puede utilizar una biblioteca como Json.NET.

En lugar de hacer que su página .aspx emita JSON, considere usar un servicio web (asmx) o WCF, ambos con salida JSON.

+0

ok Estoy actualizando mi pregunta. –

+1

Respuesta actualizada para incluir Response.End(); de lo contrario, se pueden generar controles de página –

+0

Uno de los problemas que enfrentamos con este enfoque es: si su página es compleja y tiene múltiples controles de usuario y supone que una de sus páginas busca una cookie y si no está presente, intenta establecerlo. Esto siempre generará un error al arrojar el error 'El servidor no puede modificar las cookies después de que se hayan enviado los encabezados HTTP'. –

11

no hay problema haciéndolo con asp ... es más natural hacerlo con MVC, pero también se puede hacer con asp estándar.

El framework MVC tiene todo tipo de clases de ayuda para JSON, si puedes, te sugiero que suscites algo de MVC-love, si no, probablemente puedas simplemente obtener las clases de ayuda JSON utilizadas por MVC y usarlas ellos en el contexto de asp.net.

edición:

He aquí un ejemplo de cómo devolver datos JSON con MVC. Esto estaría en tu clase de controlador. Esta es una funcionalidad lista para usar con MVC: cuando organizas un nuevo proyecto de MVC, estas cosas se crean automáticamente, por lo que no es nada especial. Lo único que estoy haciendo es devolver un resultado de acción que sea JSON. El método JSON al que estoy llamando es un método en la clase Controller.Todo esto es muy básico, por defecto MVC cosas:

public ActionResult GetData() 
{ 
    data = new { Name="kevin", Age=40 }; 
    return Json(data, JsonRequestBehavior.AllowGet); 
} 

Estos datos de retorno podría ser llamado a través de jQuery como una llamada ajax así:

$.get("/Reader/GetData/", function(data) { someJavacriptMethodOnData(data); }); 
+2

gracias por la respuesta, no estoy usando MVC, pero entraré en la investigación a partir de su respuesta. Mientras hago eso, ¿puede proporcionarme algunos recursos que ya conoce, si los tiene? –

11

Con páginas Web ASP.NET se puede hacer esto en una sola página como un ejemplo GET básico (lo más simple posible que puede funcionar.

var json = Json.Encode(new { 
    orientation = Cache["orientation"], 
    alerted = Cache["alerted"] as bool?, 
    since = Cache["since"] as DateTime? 
}); 
Response.Write(json); 
+3

Tuve que buscar esto, por lo que en caso de que alguien más no sepa, ese objeto Json es System.Web.Helpers.Json - Si ya no hace referencia a esa DLL, o no puede, puede usar System.Web.Script.Serialization.JavaScriptSerializer, que funciona de la misma manera. – eselk

+0

@Scott: si recorriera un conjunto de registros en una sola página de ASP.net, ¿cómo los agruparía (en lugar de individuales como en su ejemplo)? – webdad3

0

Si obtiene el código detrás, use algunos como este

 MyCustomObject myObject = new MyCustomObject(); 
     myObject.name='try'; 
     //OBJECT -> JSON 
     var javaScriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
     string myObjectJson = javaScriptSerializer.Serialize(myObject); 
     //return JSON 
     Response.Clear();  
     Response.ContentType = "application/json; charset=utf-8"; 
     Response.Write(myObjectJson); 
     Response.End(); 

Así que devuelve un objeto json serializado con todos los atributos de MyCustomObject.

Cuestiones relacionadas