Как я могу получить объект JsonResult в виде строки, чтобы я мог изменить его? - PullRequest
8 голосов
/ 24 ноября 2008

Я использую плагин FlexiGrid jQuery, и мне нужно вернуть объект JSON из моего приложения MVC, достаточно просто, если FlexiGrid взял только объект, но мне нужно добавить несколько элементов в строку ответа, чтобы он работал правильно с FlexiGrid.

Итак, вот часть кода моего контроллера:

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

К сожалению, в приведенном выше коде Json(objCustomerList) возвращает 'System.Web.MVV.JsonResult' вместо требуемых строковых данных JSON. Я также попытался Json(objCustomerList).ToString() просто посмотреть, что произойдет, и снова то же самое.

Есть идеи?

Ответы [ 4 ]

15 голосов
/ 24 ноября 2008
Метод

Json() в ASP.NET MVC просто использует класс JavaScriptSerializer через класс JsonResult. Вы можете использовать это самостоятельно, если хотите сериализовать объект objCustomerList с использованием JSON в строку.

Я бы порекомендовал немного другой подход.

  • Создайте модель, которая представляла бы .NET-эквивалент объекта JavaScript, который вы пытались создать. Может быть, объект FlexiGridModel со свойствами Page, Total, Rows и CustomerList.
  • Затем, когда вы передадите эту FlexiGridModel в Json(), она будет работать, не нужно создавать строку JSON, используя StringBuilder.

Если вы просто хотите, чтобы ваш код работал, есть переопределение для JavaScriptSerializer.Serialize(), которое принимает объект для сериализации и StringBuilder для добавления результатов. Что должно быть именно то, что вы ищете.

Некоторые соответствующие ссылки:

10 голосов
/ 11 марта 2010

Вы также можете сделать это:

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

Просто так: D

редактировать: код подсветки

2 голосов
/ 25 ноября 2008

Я немного изменил пример Codeproject:

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

Теперь в моем контроллере я просто звоню:

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

Пока объект, который я передаю, является списком объектов, он отлично работает.

0 голосов
/ 24 ноября 2008

В этой статье подробно описывается, как заставить Flexigrid работать с MVC:

Пример ASP.NET MVC Flexigrid

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