2008-11-24 20 views
8

Estoy usando el complemento jQuery de FlexiGrid y necesito recuperar un objeto JSON de mi aplicación MVC, lo suficientemente simple si el FlexiGrid tomó solo el objeto pero necesito agregar algunos elementos a la cadena de respuesta para que funcione correctamente con FlexiGrid.¿Cómo puedo obtener un objeto JsonResult como una cadena para poder modificarlo?

Así que aquí es una parte de mi código del controlador:

If Request.QueryString("json") IsNot Nothing Then 
    Dim data As New StringBuilder() 
    data.Append("page: " & pageIndex & "," & vbCrLf) 
    data.Append("total: " & ViewData.TotalCount & "," & vbCrLf) 
    data.Append("rows: ") 
    data.Append(Json(objCustomerList)) 

    Return Content(data.ToString()) 
End If 

Desafortunadamente en el código anterior Json(objCustomerList) devuelve 'System.Web.MVV.JsonResult' en lugar de los datos de cadena JSON deseados. También probé Json(objCustomerList).ToString() solo para ver qué pasaría y lo mismo otra vez.

¿Alguna idea? método

Respuesta

2

terminé modifiying el ejemplo CodeProject un poco:

Imports System.Web.Script.Serialization 
Imports System.Reflection 

Public Class FlexiGrid 

    Public Class FlexigridRow 
     Public id As String 
     Public cell As New List(Of String)() 
    End Class 

    Public Class FlexigridObject 
     Public page As Integer 
     Public total As Integer 
     Public rows As New List(Of FlexigridRow)() 
    End Class 

    Public Shared Function GetFlexiGridJSON(ByVal page As Integer, ByVal total As Integer, ByVal o As Object) As String 

     Dim js As New JavaScriptSerializer 
     Dim flexiGrid As New FlexigridObject 
     Dim i As Integer = 0 
     flexiGrid.page = page 
     flexiGrid.total = total 

     For Each c In o 
      Dim r As New FlexigridRow() 
      r.id = i 
      r.cell = GetPropertyList(c) 
      flexiGrid.rows.Add(r) 
      i += i 
     Next 

     Return js.Serialize(flexiGrid) 
    End Function 

    Private Shared Function GetPropertyList(ByVal obj As Object) As List(Of String) 

     Dim propertyList As New List(Of String)() 

     Dim type As Type = obj.[GetType]() 
     Dim properties As PropertyInfo() = type.GetProperties(BindingFlags.Instance Or BindingFlags.[Public]) 
     For Each [property] As PropertyInfo In properties 
      Dim o As Object = [property].GetValue(obj, Nothing) 
      propertyList.Add(If(o Is Nothing, "", o.ToString())) 
     Next 

     Return propertyList 

    End Function 

End Class 

Ahora en mi controlador de E a llamarlo:

Return Content(GetFlexiGridJSON(pageIndex, TotalCount, objCustomerList)) 

Mientras el objeto que pase es una lista de objetos que funciona perfectamente.

15

Json() en ASP.NET MVC es sólo con la clase JavaScriptSerializer través de la clase JsonResult. Podría usarlo usted mismo si quisiera serializar el objeto objCustomerList usando JSON en una cadena.

Mi recomendación sería adoptar un enfoque ligeramente diferente.

  • Cree un modelo que represente el equivalente .NET del objeto JavaScript que estaba intentando crear. Tal vez un objeto FlexiGridModel con propiedades de Página, Total, Filas y Lista de clientes.
  • Luego, cuando pase ese FlexiGridModel al Json(), simplemente funcionaría, no es necesario construir una cadena JSON usando StringBuilder.

Si lo que desea es que su código funcione hay un override on JavaScriptSerializer.Serialize() que lleva el objeto a serializar y la StringBuilder anexar los resultados a. Que debería ser exactamente lo que estás buscando.

Algunos enlaces relevantes:

+0

exactamente lo que necesitaba. Gracias cuchara y stackoverflow – Hcabnettek

10

También puede hacer esto:

JsonResult json = ... ; 
JavaScriptSerializer serializer = new JavaScriptSerializer(); 
string yourJsonResult = serializer.Serialize(json.Data); 

Tan simple como eso: D

edición: Código de iluminación de alta

Cuestiones relacionadas