2012-01-30 56 views
6

Tôi đang cố gắng gửi một số dữ liệu JSON đến phương thức hành động điều khiển ASP.NET MVC3 của tôi, nhưng nó sẽ không hoạt động bất kể tôi làm gì.ASP.NET MVC gửi dữ liệu JSON đến một Action Controller

Đây là cuộc gọi ajax của tôi (nó sử dụng phương pháp JSON.stringify từ json2.js):

$.ajax({ 
     url: '/Home/GetData', 
     type: "POST", 
     dataType: "json", 
     contentType: "application/json; charset=utf-8;", 
     data: JSON.stringify(filters_data), 
     success: function (data) { 
      alert(data); 
     } 
    }); 

Các Fiddler cho thấy yêu cầu như thế này:

POST http://localhost:51492/Home/GetData HTTP/1.1 
Host: localhost:51492 
Connection: keep-alive 
Content-Length: 171 
Origin: http://localhost:51492 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko)  Chrome/16.0.912.75 Safari/535.7 
Content-Type: application/json; charset=UTF-8; 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://localhost:51492/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

{"Filters":[{"Field":3,"Operator":0,"Values":["30.01.2012.","30.01.2012."]},{"Field":2,"Operator":0,"Values":["-1"]},{"Field":0,"Operator":0,"Values":["some-string"]}]} 

My C# code:

[HttpPost] 
public string GetData(QueryFilters filters) 
{ 
    return "Ho ho ho and a bottle of rum."; 
} 

[Serializable] 
public enum Fields 
{ 
     A, 
     B, 
     C, 
     D 
} 

[Serializable] 
public enum FilterOperator 
{ 
    Is, 
    Between, 
    GreaterOrEqual, 
} 

[Serializable] 
public class QueryFilter 
{ 
    public Fields Field { get; set; } 
    public FilterOperator Operator { get; set; } 
    public List<string> Values { get; set; } 
} 

[Serializable] 
public class QueryFilters 
{ 
    public List<QueryFilter> Filters { get; set; } 
} 

Tôi đã thêm dòng sau vào phương thức Application_Start() của global.asax.cs:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

Điểm ngắt trong phương thức hành động 'GetData' bị trúng, nhưng giá trị của thuộc tính Bộ lọc bị vô hiệu. Bất kỳ ý tưởng?

Lưu ý khác: Tôi đã thử truyền một đối tượng đơn giản hơn nhiều: Tên chuỗi thuộc tính Person và int Age, với cùng một kết quả - có vẻ như ràng buộc mô hình tự động không hoạt động đối với tôi nhưng tôi không biết làm thế nào để kiểm tra nó.

Trả lời

5

Vấn đề là đối số hành động của bạn được gọi là filters và bên trong mô hình QueryFilters của bạn, bạn có thuộc tính được gọi là Filters gây nhầm lẫn cho trình kết nối mô hình mặc định.

Vì vậy, chỉ cần đổi tên luận hành động của bạn:

[HttpPost] 
public ActionResult GetData(QueryFilters model) 
{ 
    return Json("Ho ho ho and a bottle of rum."); 
} 

Oh và nhận thấy rằng hành động nên trở ActionResults không dây.

Cũng loại bỏ các dòng sau từ global.asax của bạn:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

ASP.NET MVC 3 đã có built-in này.

Hoặc nếu bạn hoàn toàn vì lý do cần phải có lập luận hành động của bạn được gọi là filters sau đó bạn cũng có thể sửa đổi theo yêu cầu JSON bạn đang gửi đến này:

data: JSON.stringify({ 
    filters: { 
     Filters: [ 
      { "Field": 3, "Operator": 0, "Values": ["30.01.2012.", "30.01.2012."] }, 
      { "Field": 2, "Operator": 0, "Values": ["-1"] }, 
      { "Field": 0, "Operator": 0, "Values": ["some-string"] } 
     ] 
    } 
}), 

Bây giờ không có sự mơ hồ hơn.

+0

+1 Cũng được phát hiện. Tôi không thể tìm thấy thứ tôi đã tham chiếu trong câu trả lời của tôi, vì vậy đã xóa nó ... –

+0

Cảm ơn bạn rất nhiều! Tôi không thể giải thích tôi cảm thấy thất vọng như thế nào, thử hàng tỉ thứ khác nhau và hóa ra lại là một vấn đề đặt tên đơn giản. – skali

+0

Tuyệt vời tất cả các cách, tôi đã được tìm kiếm xa và gần cho điều này, nhưng tất nhiên, đó là trên stack! –

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