เพื่อสรุปสิ่งต่าง ๆ มีวิธีแก้ปัญหา 4 ข้อนี้:
โซลูชันที่ 1: ปิด ProxyCreation สำหรับ DBContext และคืนค่าในท้ายที่สุด
private DBEntities db = new DBEntities();//dbcontext
public ActionResult Index()
{
bool proxyCreation = db.Configuration.ProxyCreationEnabled;
try
{
//set ProxyCreation to false
db.Configuration.ProxyCreationEnabled = false;
var data = db.Products.ToList();
return Json(data, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(ex.Message);
}
finally
{
//restore ProxyCreation to its original state
db.Configuration.ProxyCreationEnabled = proxyCreation;
}
}
โซลูชันที่ 2: การใช้ JsonConvert โดยการตั้งค่า ReferenceLoopHandling เพื่อละเว้นการตั้งค่า serializer
//using using Newtonsoft.Json;
private DBEntities db = new DBEntities();//dbcontext
public ActionResult Index()
{
try
{
var data = db.Products.ToList();
JsonSerializerSettings jss = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore };
var result = JsonConvert.SerializeObject(data, Formatting.Indented, jss);
return Json(result, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(ex.Message);
}
}
การแก้ปัญหาสองวิธีต่อไปนี้เหมือนกัน แต่การใช้แบบจำลองจะดีกว่าเพราะมันพิมพ์ได้ดี
โซลูชันที่ 3: ส่งคืนแบบจำลองซึ่งรวมถึงคุณสมบัติที่จำเป็นเท่านั้น
private DBEntities db = new DBEntities();//dbcontext
public class ProductModel
{
public int Product_ID { get; set;}
public string Product_Name { get; set;}
public double Product_Price { get; set;}
}
public ActionResult Index()
{
try
{
var data = db.Products.Select(p => new ProductModel
{
Product_ID = p.Product_ID,
Product_Name = p.Product_Name,
Product_Price = p.Product_Price
}).ToList();
return Json(data, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(ex.Message);
}
}
โซลูชันที่ 4: ส่งคืนวัตถุไดนามิกใหม่ซึ่งรวมถึงคุณสมบัติที่จำเป็นเท่านั้น
private DBEntities db = new DBEntities();//dbcontext
public ActionResult Index()
{
try
{
var data = db.Products.Select(p => new
{
Product_ID = p.Product_ID,
Product_Name = p.Product_Name,
Product_Price = p.Product_Price
}).ToList();
return Json(data, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(ex.Message);
}
}
ScriptIgnore
แอตทริบิวต์ stackoverflow.com/questions/1193857/subsonic-3-0-0-2-structs-tt