2014-02-17 119 views
0

我在我的mvc應用程序中使用web api。使用jquey.get函數調用web api時遇到問題。考慮以下情形:Asp.net的web api路由問題?

我有2個控制器名稱:

  1. HomeMVCController
  2. TestAPIController (使用MVC樣式路由即,API/{控制器}/{行動}/{ID})

HomeMVC控制器包含2個動作

  1. 指數
  2. 關於

TestAPI控制器包含1作用

  1. 獲取

當我在HomeMVC索引視圖控制器即

http://localhost:1025/Home 

當我請從瀏覽器中撥打$.get("api/TestAPI/Get")它返回預期的json響應。

但是,當我在關於視圖HomeMVC控制器即

http://localhost:1025/Home/About 

,當我打電話$.get("api/TestAPI/Get")從它返回錯誤的瀏覽器,資源沒有找到,而且它正試圖找到資源:

http://localhost:1025/Home/About/api/TestAPI/Get 

,而不是

http://localhost:1025/api/TestAPI/Get 

爲什麼瀏覽器添加首頁/關於在url中爲api和爲什麼不添加首頁/索引當我在索引查看。上索引查看爲什麼api電話按預期工作,爲什麼不工作關於視圖?

回答

1

當您應該使用絕對網址時,您使用了relative url

而應該做使用絕對URL:

$.get("@Url.RouteUrl("@Url.RouteUrl("DefaultApi", new {httproute="", controller="TestAPI", action="Get"})) 

如果你想保持你的JavaScript在單獨的js文件(而不是在剃刀文件)你可以做的是有一個初始化方法從剃刀視圖中調用。

The。js文件:

var myPageJsUrls = {}; 

var MyPageInitialize = function(getItemsUrl, saveItemUrl, editItemUrl){ 
    myPageJsUrls.getItemsUrl = getItemsUrl; 
    myPageJsUrls.saveItemUrl = saveItemUrl; 
    myPageJsUrls.editItemUrl = editItemUrl; 
} 


var getItems = function(){ 
    return $.get(myPageUrls.getItemsUrl); 
} 

... 

在剃刀文件:

<script> 
    myPageInitialize('@Url.Action("AllItems", "Items")', '@Url.RouteUrl("DefaultApi", new {httproute="", controller="TestAPI"}, ...) 
</script> 
+0

但正在使用服務器語法生成絕對URL,我怎麼可以在js文件中使用此? – user1740381

+0

我通常做的是我有一個Initialize方法,它是從Razor視圖中調用的,並且包含所有需要javascript的url,例如:'Initialize({testApiGet:'@ Url.RouteUrl(...)',GetItems:' @ Url.Action(...)'})'。我會用一個例子來更新答案 – Rui