2014-02-16 68 views
2

下面是一個POST URL與內容類型application/x-WWW窗體-urlencoded天冬氨酸MVC模式與內容類型application/x-WWW窗體-urlencoded

POST 
http://partner-site.com/api_implementation/hotel_availability 

BODY 
api_version=4 
&hotels=[{"ta_id":97497,"partner_id":"229547","partner_url":"http://partner.com/deeplink/to/229547"},{"ta_id":97832,"partner_id":"id34234","partner_url":"http://partner.com/deeplink/to/id34234"}] 
&start_date=2013-07-01 
&end_date=2013-07-03 
&num_adults=2 
&num_rooms=1 
&lang=en_US 
&currency=USD 
&user_country=US 
&device_type=d 
&query_key=6167a22d1f87d2028bf60a8e5e27afa7_191_1360299600000_2_2 

CONTENT TYPE 
application/x-www-form-urlencoded 

,我已經寫了所述陣列的結合類,讀起來像

public class HotelAvailabilityRequest 
{ 
    public int api_version { get; set; } 
    public List<HotelSummary> hotels { get; set; } 
    public string start_date { get; set; } 
    public string end_date { get; set; } 
    public int num_adults { get; set; } 
    public int num_rooms { get; set; } 
    public string lang { get; set; } 
    public string query_key { get; set; } 
    public string currency { get; set; } 
    public string user_country { get; set; } 
    public string device_type { get; set; }   
} 

public class HotelSummary 
{ 
    public int ta_id { get; set; } 
    public string partner_id { get; set; } 
    public string partner_url { get; set; } 
} 

,當我在我的ASP MVC方法

public ActionResult Hotel_Availability(HotelAvailabilityRequest request) 
{} 

我得到o使用HotelAvailabilityRequest療法參數一樣request.api_version,request.device_type除了request.hotels

我得到request.hotels.Count()等於零

我如何得到request.hotel以相應地進行綁定?

+0

嘗試更改內容類型爲'application/json' –

+0

POST請求由我無法控制的第三方進行。任何其他方式? –

+0

您必須創建一個自定義模型聯編程序。 http://www.dotnetcurry.com/showarticle.aspx?ID=584 –

回答

0

經過幾輪測試後,我訴諸手動解析和反序列化我的查詢字符串。由於原始類型(int,像request.api_version這樣的字符串)可以很好地被默認的模型綁定器捕獲,所以我的重點是解決複雜的對象類型(request.hotels)問題。

首先,我得到充分的查詢字符串

Request.InputStream.Position = 0; 
    var queryString = new StreamReader(Request.InputStream).ReadToEnd(); 
    var queryStringCollection = HttpUtility.ParseQueryString(queryString); 

然後,我反序列化的查詢字符串到預期的對象列表

var hotelStr = queryStringCollection.Get("hotels"); 
    var requestHotels = (List<HotelSummary>) JsonConvert.DeserializeObject(hotelStr, typeof (List<HotelSummary>)); 
    request.hotels = requestHotels; 

不是最好的解決方案,但它的工作原理。希望有人爲ASP MVC制定一個更好的ModelBinder,以便在綁定時解析複雜的對象類型。