Я использую подключаемый модуль 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(), просто чтобы посмотреть, что произойдет, и снова то же самое.
Есть идеи?





Метод Json() в ASP.NET MVC просто использует класс JavaScriptSerializer через класс JsonResult. Вы можете использовать это самостоятельно, если хотите сериализовать объект objCustomerList с помощью JSON в строку.
Я бы порекомендовал немного другой подход.
Json(), он будет просто работать, нет необходимости создавать строку JSON с использованием StringBuilder.Если вы просто хотите, чтобы ваш код работал, существует переопределить на JavaScriptSerializer.Serialize(), который принимает объект для сериализации, и StringBuilder для добавления результатов. Что должно быть именно тем, что вы ищете.
Некоторые релевантные ссылки:
В итоге я немного изменил пример 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))
Пока объект, который я передаю, является списком объектов, он работает отлично.
Вы также можете сделать это:
JsonResult json = ... ;
JavaScriptSerializer serializer = new JavaScriptSerializer();
string yourJsonResult = serializer.Serialize(json.Data);
Вот так просто: D
изменить: код высокого освещения
именно то, что мне нужно. Спасибо ложка и stackoverflow