2013-08-06 38 views
2

我試圖將一個複雜的對象傳遞給ServiceStack,使用對GET請求的jQuery AJAX調用。需要幫助使用jQuery AJAX將複雜對象傳遞給ServiceStack

代碼如下所示:

型號:

public class Filter 
{ 
    #region constructors 

    public Filter() 
    { 
    } 

    #endregion 

    #region properties 

    [AutoIncrement] 
    [PrimaryKey] 
    public int ID { get; set; } 
    public bool? Huddles { get; set; } 
    public List<Activity> Activities { get; set; } 
    public string[] Looker { get; set; } 
    public string LookerGender { get; set; } 
    public string[] Lookee { get; set; } 
    public string LookeeGender { get; set; } 
    public DateTime? MinDate { get; set; } 
    public DateTime? MaxDate { get; set; } 
    public bool? ASAP { get; set; } 
    [References(typeof(ZipCode))] 
    public int? ZipCode { get; set; } 
    public int? Radius { get; set; } 

    #endregion 
} 

服務:

[Route("/v1/upfors/search")] 
public class SearchUpFors 
{ 
    public Filter Filter { get; set; } 
} 

public class UpForService : Service 
{ 
    public List<UpForView> Get(SearchUpFors request) 
    { 
     OrmLiteConfig.DialectProvider = MySqlDialect.Provider; 
     string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ufsbe"].ConnectionString; 
     using (IDbConnection db = connectionString.OpenDbConnection()) 
     { 
      //TO DO 
      //Build where clause based on filter properties 
      List<UpForView> allUpFors; 
      //If Activity(ies) selected, get filtered list 
      if (request.Filter.Activities.Count > 0) 
      { 
       string[] activityNames = new string[request.Filter.Activities.Count]; 
       int i=0; 
       foreach (Activity activity in request.Filter.Activities) 
       { 
        activityNames[i] = activity.Name; 
        i++; 
       } 
       allUpFors = db.Select<UpForView>(q => Sql.In(q.Activity, activityNames)); 
      } 
      else 
       allUpFors = db.Select<UpForView>(); 
      return allUpFors; 
     } 
    } 

} 

客戶端代碼:這個填充複雜的對象,並把它傳遞給ServiceStack服務爲JSON。

$('#frmFilter').submit(function (e) { 
     e.preventDefault(); 
     var data = {}; 
     var activities = []; 
     $('#ddlActivity :selected').each(function (i, selected) { 
      activities.push({ ID: $(selected).val(), Name: $(selected).text() }); 
     }); 
     data["Activities"] = activities; 
     data["ZipCode"] = $('#txtZipCode').text(); 
     data["Radius"] = $('#txtRadius').text(); 
     $.ajax({ 
      url: "service url here", 
      type: "GET", 
      data: "{'Filter':" + JSON.stringify(data) + "}", 
      contentType: "application/json", 
      dataType: "xml" 
     }); 
    }); 

問題:

對象獲取服務創建,但request.Filter的所有屬性都爲空,即使是活動對象。

任何意見將不勝感激...

+2

在HttpGet請求中發送複雜對象很麻煩,請嘗試使用HttpPost請求。 – Wim

+0

我同意@Wim。通常情況下,如果您使用的是自己的服務,請使對象簡單或使用帖子。您也可以使用複雜對象,但客戶端發送簡單對象,然後在服務器端映射覆雜對象,這會使您的工作變得容易一些。讓我知道你是否需要更多細節。 – kunjee

回答

1

SerivceStack期待你send your complex typeJSVJSON格式化。

您可以用JSV而不是JSON格式化請求,類似於ServiceStack項目中的JSV.js,或者實現您自己的Request Binder以反序列化JSON。

public override void Configure(Container container) 
{ 
    RequestBinders.Add(typeof (SearchUpFors), (IHttpRequest httpReq) => { 
     var filter = JsonSerializer.DeserializeFromString<Filter>(httpReq.QueryString.Get("Filter")); 
     return new SearchUpFors {Filter = filter}; 
    }); 
}