2011-01-12 46 views
1

我的MVC 3控制器操作不是反序列化來自AJAX文章的JSON數據。MVC 3與ajax沒有在Model Controller中執行ModelBinding操作

  • Fiddler顯示正確傳遞的數據。
  • 我把一個斷點放在var x =「ok!」;線,它每次都擊中它。
  • 從.ajax()中刪除contentType時,會創建地址對象,但屬性爲空值。
  • 通過請求中的contentType,地址對象爲空。
  • 我試圖把[DataContract]和[數據成員]我的POCO,沒有什麼區別
  • 我試圖使用IModelBinder,但StreamReader的(Request.InputStream).ReadToEnd總是 「」

這裏是jQuery代碼:

$("#home-validate-btn").click(function (event) { 
    var address = 
    { 
     Address: $('#Data_HomeAddress').val(), 
     City: $('#Data_HomeCity').val(), 
     State: $('#Data_HomeState').val(), 
     Zip: $('#Data_HomeZip').val() 
    }; 

    $.ajax({ 
     url: '/Settings/addressValidate', 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     data: $.toJSON(address),    
     success: function (info) { 
      alert('ok!'); 
     } 
    }); 
}); 

這裏的控制器代碼:

[AcceptVerbs(HttpVerbs.Post)]   
    public ActionResult addressValidate(ValidateAddress address) 
    { 
     var x = "ok!"; 
     return new JsonResult() 
     { 
      Data = (x), 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet 
     }; 
    } 

我的POCO:

public class ValidateAddress 
{   
    public string Address { get; set; }   
    public string City { get; set; }   
    public string State { get; set; } 
    public string Zip { get; set; } 
} 

我的Global.asax.cs

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}", // URL with parameters 
      new 
      { 
       controller = "Home", 
       action = "Index" 
      } // Parameter defaults 
     ); 
    } 

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

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

這裏從提琴手的數據:

  • POST http://localhost.:59872/Settings/addressValidate HTTP /1.1
  • x-requested-with:XMLHttpRequest
  • Accept-Language:en-us
  • Referer:http://localhost.:59872/Settings/Addresses?Length=8
  • 接受:application/json,text/javascript,*/*; q = 0.01
  • Content-Type:application/json;字符集= UTF-8
  • 接受編碼:gzip,放氣
  • 的User-Agent:Mozilla的/ 4.0(兼容; MSIE 8.0; Windows NT的6.1; WOW64;三叉戟/ 4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; OfficeLiveConnector.1.5; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E; Creative AutoUpdate v1.40.01; msn OptimizedIE8; ENUS)
  • 主持人:localhost.:59872
  • 的Content-Length:77
  • 連接:保持活動
  • 雜注:無緩存
  • Cookie:__RequestVerificationToken_Lw __ = IBBY7VzoqxMI ....(其他字符串剪切)
  • ASP。NET_SessionId = fsjywpn4gqasszgcdgmkqd4p
  • { 「地址」: 「大街1號」, 「城市」: 「海灘之城」, 「國家」: 「FL」, 「郵編」: 「99999」}

回答

2

問題是我需要將返回數據封裝在名爲「address」的對象中以匹配方法定義。我傳遞的是數組而不是帶有屬性的對象。

新JSON =

var addressObj = { 
     address: { 
      Address: $('#Data_HomeAddress').val(), 
      City: $('#Data_HomeCity').val(), 
      State: $('#Data_HomeState').val(), 
      Zip: $('#Data_HomeZip').val() 
     } 
    }; 
在阿賈克斯

() - 數據:$ .toJSON(addressObj),

老JSON =

var address = 
{ 
    Address: $('#Data_HomeAddress').val(), 
    City: $('#Data_HomeCity').val(), 
    State: $('#Data_HomeState').val(), 
    Zip: $('#Data_HomeZip').val() 
}; 

老阿賈克斯() had - data:$ .toJSON(address),

http://forums.asp.net/p/1642394/4252987.aspx#4252987