【问题标题】:Asp.net web api routing issue?Asp.net web api路由问题?
【发布时间】:2014-02-17 10:05:14
【问题描述】:

我在我的 mvc 应用程序中使用 web api。使用 jquey.get 函数调用 web api 时出现问题。考虑以下场景:

我有 2 个控制器名称:

  1. HomeMVC控制器
  2. TestAPIController (使用 mvc 样式路由,即 api/{controller}/{action}/{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  

为什么浏览器在 api 的 url 中添加 Home/About 以及为什么当我在 Index 视图时没有添加 Home/Index .在 Index 视图上为什么 api 调用按预期工作,为什么在 About 视图上不工作??

【问题讨论】:

    标签: c# jquery asp.net-mvc asp.net-web-api


    【解决方案1】:

    当您应该使用绝对网址时,您使用了relative url

    您应该改为使用绝对网址:

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

    如果您想将 javascript 保存在单独的 js 文件中(而不是 razor 文件中),您可以做一个从 razor 视图调用的初始化方法。

    .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>
    

    【讨论】:

    • 但是您使用服务器语法来生成绝对 url,我如何在 js 文件中使用它??
    • 我通常做的是我有一个从 Razor 视图调用的 Initialize 方法以及 javascript 需要的所有 url,例如:Initialize({testApiGet: '@Url.RouteUrl(...)', GetItems: '@Url.Action(...)'})。我会用一个例子来更新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多