2012-11-08 26 views
8

Tôi có một hành động trả về một JsonResult cho một đối tượng của một lớp cụ thể. Tôi đã trang trí các thuộc tính của lớp này với một số attrib để tránh các lĩnh vực null. định nghĩa lớp là:MVC4 Hành động trả về JsonResult mà không có null

private class GanttEvent 
    { 
     public String name { get; set; } 

     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public String desc { get; set; } 

     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public List<GanttValue> values { get; set; } 
    } 

Và trong hành động của tôi sử dụng một đối tượng

var res = new List<GanttEvent>(); 

mà tôi trả lại sử dụng:

return Json(res, JsonRequestBehavior.AllowGet); 

Unfortunatelly, tôi vẫn nhận được các giá trị null ở đầu ra:

[{"name":"1.1 PREVIOS AL INICIO ","desc":null,"values":null},{"name":"F04-PGA-S10","desc":"Acta preconstrucción","values":null},{"name":"F37-PGA-S10","desc":"Plan de inversión del anticipo","values":null},{"name":"F09-PGA-S10","desc":"Acta de vecindad","values":null},{"name":"F05-PGA-S10","desc":"Acta de inicio","values":null},{"name":"F01-PGA-S10","desc":"Desembolso de anticipo","values":null}] 

Tôi có thiếu một cái gì đó hoặc làm điều gì đó sai?

Trả lời

6

Như đã nêu bởi Brad Christie, MVC4 ảnh tĩnh sử dụng JavaScriptSerializer, vì vậy để có được đối tượng của bạn được tuần tự hóa bởi Json.Net, bạn sẽ phải thực hiện một vài bước.

Thứ nhất, kế thừa một JsonNetResult mới lớp từ JsonResult như sau (dựa trên this solution):

public class JsonNetResult : JsonResult 
{ 
    public JsonNetResult() 
    { 
     this.ContentType = "application/json"; 
    } 

    public JsonNetResult(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior jsonRequestBehavior) 
    { 
     this.ContentEncoding = contentEncoding; 
     this.ContentType = !string.IsNullOrWhiteSpace(contentType) ? contentType : "application/json"; 
     this.Data = data; 
     this.JsonRequestBehavior = jsonRequestBehavior; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     var response = context.HttpContext.Response; 

     response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; 

     if (ContentEncoding != null) 
      response.ContentEncoding = ContentEncoding; 

     if (Data == null) 
      return; 

     // If you need special handling, you can call another form of SerializeObject below 
     var serializedObject = JsonConvert.SerializeObject(Data, Formatting.None); 
     response.Write(serializedObject); 
    } 
} 

Sau đó, trong điều khiển của bạn, ghi đè lên các phương pháp Json để sử dụng lớp mới:

protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) 
{ 
    return new JsonNetResult(data, contentType, contentEncoding, behavior); 
} 
+0

Không biết câu trả lời này vẫn có liên quan, nhưng tôi cần một cái gì đó như thế này, và đã làm một c/p mã của bạn. Thật không may, nó không hoạt động như mong đợi, nhưng tôi đã chỉnh sửa lớp JsonNetResult của bạn một chút: var serializedObject = JsonConvert.SerializeObject (Data, Formatting.None, new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}); ... và giờ nó hoạt động hoàn hảo. cảm ơn! – robertpaulsen

0

Đề xuất của tôi sẽ là xem điều gì sẽ xảy ra nếu bạn chỉ tuần tự hóa một đối tượng GanttEvent thành JSON. Ngoài ra kiểm tra cuộc gọi của bạn để Json là thích hợp.

1

Controller.Json sử dụng JavaScriptSerializer không phải là Newtonsoft Json library (là nơi JsonPropertyAttribute bắt nguồn từ).

Bạn cần phải sử dụng thư viện thư viện Newtonsoft và trả về kết quả được tuần tự hóa theo cách đó hoặc bạn tiếp tục gọi Json và viết converter sẽ bỏ qua null.

+0

Cảm ơn, tôi đã nghi ngờ về điều đó, và bạn đã xác nhận mặc dù của tôi. Cuối cùng, Json.Net là serializer mặc định, nhưng chỉ dành cho ** WebAPI **, không dành cho trang web MVC thông thường. – Farlop

Các vấn đề liên quan