2013-04-25 52 views
2

我試圖使用OData將數據發送到Web API。但收到的實體始終爲空。POST到Web API OData,收到的實體爲空

我使用JQuery這樣調用:

 $.ajax({ 
      url: "/odata/Products", 
      type: "POST", 
      //contentType: "application/json;odata=verbose", 
      contentType: 'application/json; charset=utf-8', 
      data: JSON.stringify(productToAdd), 
      dataType: "json", 
      success: function() { 
       alert("Server call has been OK!!"); 
      }, 
      error: function() { 
       alert("Server call has been failed!!"); 
      } 
     }); 

的productToAdd對象是這樣的:

{ 「名」: 「蘋果」, 「說明」: 「好!」, 「價格」 「12.3」, 「類別」: 「果」}

我的控制器:

public class ProductsController : EntitySetController<Product, string> 
{ 
    private IProductService _prodSvc; 

    public ProductsController(IProductService prodSvc) 
    { 
     _prodSvc = prodSvc; 
    } 

    [Queryable] 
    public override IQueryable<Product> Get() 
    { 
     return _prodSvc.GetAllProducts(); 
    } 

    protected override Product CreateEntity(Product product) 
    { 
     var addedProduct = _prodSvc.AddProduct(product); 
     return addedProduct; 
    } 
} 

而且我試着使用datajs,1.10.js FR但是我得到了同樣的結果。

 OData.request(
      { 
       requestUri: "/odata/Products", 
       method: "POST", 
       data: productToAdd 
      }, 
      function (data) { 
       alert("Server call has been OK!!"); 
      } 
     ); 

我認爲當它反序列化JSON對象時有些問題,但我不知道是什麼。你可以幫幫我嗎?

謝謝!

+0

一般情況下,我建議您嘗試首先弄清楚,如果問題是一個客戶端的一個或一個服務器端的一個,當你遇到這樣的問題。使用像[Fiddler](http://fiddler2.com/)這樣的工具(或任何其他可監視HTTP請求和響應的工具)來查看從服務器返回的內容。服務器是否發送成功的狀態碼或錯誤? – 2013-04-25 18:31:52

+1

您可以檢查控制器上的ModelState屬性嗎?這應該有關於反序列化失敗的任何信息。 – 2013-04-25 19:56:05

回答

-1

謝謝Youssef !!。 ModelState屬性爲我提供了有關正在發生的事情的線索。

問題在於它區分大小寫。我的意思是,我的服務器產品對象的屬性顯然以大寫字母開頭,但JSON對象的屬性以較低的字母開頭。

我已經整理出來的映射JSON對象是這樣的:

 OData.request(
      { 
       requestUri: "/odata/Products", 
       method: "POST", 
       data: 
        { 
         Name: productToAdd.name, 
         Description: productToAdd.description, 
         Price: productToAdd.price, 
         Category: productToAdd.category 
        } 
      }, 
      AddSuccessCallback, AddErrorCallback); 

你知道,如果有任何配置選項來管理這個問題?

非常感謝幫助我!

1

由於某種原因,它看起來像web api的模型綁定器並不像我們期望從mvc中的模型綁定那樣行爲,但是這裏的上下文略有不同,表單帖子並不完全相同同樣作爲JSON對象有效載荷...

例如: 如果我定義在C#下面的類...

class Foo 
{ 
    public int Id { get; set; } 
    public string Bar { get; set; } 
} 

...然後給定的方法簽名...

public void SomeMethod(Foo data) { ... } 

...在MVC中,我可以發佈任何arbritrary塊數據,並且至少匹配某些屬性的任何內容都會被綁定。 這種情況發生在Web API上,但只有當您發佈內容類型爲「application/x-www-form-urlencoded」並且將數據串聯起來時纔會發生。

如果你想發佈適當的JSON,你必須是明確和正確的,如果你提供1個屬性或額外的屬性,它會失敗,一個模型狀態驗證錯誤,這是非常模糊的,只是說像「張貼數據驗證失敗「,沒有幫助。

您應該能夠通過在控制器的第一行放置一個斷點,然後在Modelstate中檢查該值來看到這一點。 沒有例外,只是驗證失敗和null參數。

數據仍然不過應該有和沒有什麼可以阻止您手動請求解析它與2個或3行代碼,將採取流自己。 在這個例子中,我將建議您確認您的json完全符合您的DTO。

既然是這樣的話那麼這應該工作...

$.ajax({ 
    type: method, 
    url: url, 
    data: someObject, 
    dataType: 'json', 
    beforeSend: function (xhr) { 
     xhr.setRequestHeader("Content-Type", "application/json;odata=minimalmetadata"); 
     xhr.setRequestHeader("Accept", "application/json;odata=minimalmetadata"); 
     xhr.setRequestHeader("Accept-Charset", "UTF-8"); 
     // add say auth headers here for secure endpoints 
    }, 
    success: function (newObj) { 
     // job done 
    }, 
    error: function (e) { 
     // nope, examine what server said 
    } 
});