2012-11-28 44 views
5

'Chúc mừng,JQuery Ajax và Đăng nhiều đối tượng phức tạp tới Bộ điều khiển MVC asp.net

Có vấn đề khi đăng nhiều tham số đến một phương thức điều khiển mc.

controller... 
[HttpPost] 
public ActionResult SaveSomething(SomeDomainObject domainObject, bool anOption) 
{ 
} 

Ajax Code... 
function performPostData(postDataOptions,closeWindow) { 
     $.ajax({ type: postDataOptions.httpVerb, 
      url: postDataOptions.url, 
      datatype: "json", 
      traditional: true, 
      data: postDataOptions.data(), 
      success: function() { 
       if (closeWindow) { 
        var window = $('#window').data("kendoWindow"); 
        window.close();    
       } 
      }, 
      error: function (xhr, status, error) { 
       var msg = JSON.parse(xhr.responseText); 
       var validator = $("#editBase").kendoValidator().data("kendoValidator"), 
       status = $(".editValidationStatus"); 
       var err = msg.Message; 
       status.text(err).addClass("invalid"); 
      } 
     }); 
    } 

JScript function to format data... 

function GetPostData() 
{ 
    var _domainObject={    
      prop1: 1, 
      prop2: 2, 
      prop3: 3      
     }; 
     return JSON.stringify({ domainObject:_domainObject,anOption: true}); 
} 

Tôi nhìn thấy trong chụp mạng rằng đây là cơ quan yêu cầu:

{"domainObject":{"prop1":1,"prop2":2,"Prop3":3},"anOption":true} 

Bộ điều khiển làm tăng ngoại lệ sau đây:

The parameters dictionary contains a null entry for parameter 'anOption' of non-nullable type 'System.Boolean' for method 'System.Web.Mvc.ActionResult SaveSomething(Domain.Data.SomeDomainObject, Boolean)' in 'Reports.Controllers.TestController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters 

Tôi đã được quay bánh xe của tôi trong nhiều giờ cố gắng có được một đối tượng tên miền đơn giản và một tham số khác của kiểu bool để được tuần tự hóa và truyền cho bộ điều khiển của tôi. Bất kỳ ý tưởng?

+0

Điều tiếp theo tôi đã thử là tạo một SaveObjectRequestObject như SaveObjectRequest: DomainObject {public bool AnOption {get; set;}}. Điều này thực sự truy tìm thông qua bộ điều khiển nhưng thuộc tính cơ sở đối tượng của tôi không bao giờ được thiết lập. –

Trả lời

5

Có vẻ như bạn đang thiếu thông số loại nội dung trong cuộc gọi jquery ajax. Bạn rõ ràng nên thiết lập nó như json, như trong đoạn mã này:

function performPostData(postDataOptions,closeWindow) { 
    $.ajax({ type: postDataOptions.httpVerb, 
     url: postDataOptions.url, 
     datatype: "json", 
     contentType: "application/json; charset=utf-8", 

     ...rest of your code 

Nếu không nó sẽ nhận giá trị mặc định của nó (xem http://api.jquery.com/jQuery.ajax/):

application/x-www-form-urlencoded ; charset = UTF-8

+0

Nó chỉ ra rằng sau khi tôi phẳng yêu cầu điều khiển obejct ra tôi có thể theo dõi để điều khiển. Sau đó, loại bỏ JSON.stringify trả về ({request: SaveDomainObjectRequest}); và chỉ trả về someDomainObjectRequest đã làm việc. Tuy nhiên, tôi sẽ đánh dấu phản hồi của bạn là câu trả lời, tôi không có thời gian để hoàn nguyên và kiểm tra: ( –

+0

Câu trả lời này đã khắc phục được sự cố của tôi. Vì lý do nào đó, mặc định jQuery không đủ tốt để bộ điều khiển MVC của tôi liên kết Đơn giản chỉ cần gửi các biến thể JSON (như được mô tả trong bài này) đã làm mọi thứ liên kết một cách hoàn hảo. –

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