我在Visual Studio 2010中使用ASP.NET MVC 2.我的许多控制器操作都需要将我的POCO域对象序列化为JSON。顺便说一下,我使用nhibernate作为我的ORM。
我正在使用System.Web.Script.Serialization.JavaScriptSerializer。它很好地处理简单属性(int,string,date等),但它跳过引用属性,所以我必须将我的对象映射到匿名类型,然后将这个匿名类型提供给JavaScriptSerializer,如下所示:
Public Class Order
Public Property ID As Integer
Public Property Customer As User
End Class
Function Details() As ActionResult
Dim realorder As Order = DB.Get(Of Order)(id)
Dim flattenedorder As New With {
.id = realorder.ID, .customerid = realorder.Customer.ID}
Dim encoder = New System.Web.Script.Serialization.JavaScriptSerializer()
ViewData("order") = encoder.Serialize(flattenedorder)
Return View()
End Function
在上面的示例中,Order.ID是一个int,但Order.Customer是对另一个对象的引用。我必须创建一个匿名类型,我指定.customerid = realorder.Customer.ID,所以它被正确序列化。
我想知道的是,有更简单的方法吗?我的域对象有很多引用,我想避免每次我想将它们序列化为JSON时创建匿名类型。
答案 0 :(得分:2)
只需返回appropriate action result,不要打扰手动序列化:
Function Details() As ActionResult
Dim realorder As Order = DB.Get(Of Order)(id)
Dim flattenedorder As New With {
.id = realorder.ID, .customerid = realorder.Customer.ID}
Return Json(flattenedorder, JsonRequestBehavior.AllowGet)
End Function
就引用而言,问题源于您将域对象返回到视图而不是使用视图模型。不使用专门针对给定视图定制的视图模型是我在人们使用ASP.NET MVC时看到的最基本的错误之一。首先,定义POCO对象,它们只代表给定视图所需的域模型部分,然后您可以使用AutoMapper在模型和视图模型之间进行转换。
答案 1 :(得分:1)
@Endy:您可以使用Json.NET将您建模的序列化为Json。我通常这样做:
您可以在here的帖子中找到一些内容。希望我能帮到你!