2013-01-04 20 views
2

我正在學習ASP.NET MVC4 Web API。 我想創建一個將接收兩個參數如何創建我自己的webapi動作並使用jquery調用它?

的新方法
[HttpPost] 
public string MarkAsSeen(int objectID, long userID) 

我想使用jQuery來使用它:

$.ajax({ 
     type: "POST", 
     url: "/api/tutorial/MarkAsSeen", 
     data: JSON.stringify({ objectID: _obj, profileID: _pid }), 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (result) { 
      alert(_tutorial + ' seen'); 
     },async: true 
}); 

我有我的路線設置這樣

config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{action}" 
      ); 

但它只是不起作用:

未找到與請求URI匹配的HTTP資源'http://local.dev.unation.com/api/tutorial/MarkAsSeen'.","MessageDetail":"沒有在控制器'教程'中找到任何操作匹配請求。

如果我改變路線的模板API/{控制器}/{行動}/{的objectID}/{配置文件ID}和jQuery的方法來添加對URL此信息:/ API /教程/ MarkAsSeen/+ _obj +/+ _pid 它的工作原理。

我不希望執行這些變化的原因是:

  • 我想有到所有操作(因此它們的參數名稱/數量不應該的問題),一個普通的路由
  • 此URL追加是隻是醜,我想使用數據屬性

你能告訴我我做錯了什麼嗎?

tks!

回答

3

Web.Api並不喜歡多個參數。最簡單的解決方案是創建一種新型的握着你的數據:

public class MarkAsSeenRequest 
{ 
    public int objectID { get; set; } 

    public int profileID { get; set; } 
} 

和使用,在你的控制器動作:

[HttpPost] 
public string MarkAsSeen(MarkAsSeenRequest request) 
{ 
    //... 
} 

它應該可以正常工作與原來的路線:

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}" 
     ); 

如需進一步閱讀:

+0

我會看看,謝謝! – JSBach

+0

+1爲進一步閱讀部分 – frictionlesspulley

+0

工作,非常感謝,我永遠不會發現這個「伎倆」:)如果它是一個獲取請求,我怎麼能使用這個時使用url調用? – JSBach

相關問題