2014-02-17 67 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