2012-11-28 49 views
5

`問候,JQuery的Ajax和發佈的多個複雜的對象到ASP.NET MVC控制器

有問題張貼多個參數到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}); 
} 

我在網絡捕獲看到,這是請求正文:

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

控制器引發以下異常:

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 

我一直在紡紗我的車輪了幾個小時試圖得到一個簡單的域對象和另一個類型爲bool的參數被序列化並傳遞給我的控制器。有任何想法嗎?

+0

我嘗試的下一件事是創建一個SaveObjectRequestObject像SaveObjectRequest:DomainObject {public bool AnOption {get; set;}}。這實際上追溯到控制器,但我的基礎對象屬性從未設置。 –

回答

5

看起來你缺少jquery ajax調用中的內容類型參數。 你應該明確地將它設置爲JSON,因爲在這段代碼:

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

     ...rest of your code 

否則它會得到它的默認值(見http://api.jquery.com/jQuery.ajax/):

應用程序/ x-WWW的形式,進行了urlencoded ; charset = UTF-8

+0

事實證明,我扁平控制器請求obejct後,我可以跟蹤到控制器。然後刪除返回的JSON.stringify({request:SaveDomainObjectRequest});並且只返回someDomainObjectRequest的工作。我將標記你的回答作爲答案,但是,我沒有時間回覆和測試:( –

+0

這個答案解決了我的問題。由於某些原因,jQuery的默認不夠好,我的MVC控制器綁定複雜的集合,只需發送JSON變體(如本文所述),就可以完美地綁定所有東西。非常感謝! –

相關問題