如何创建ASP.NET Web API网址?


Answers:


139

ApiController有一个叫做物业地址是类型System.Web.Http.Routing.UrlHelper它允许你建立网址的API控制器。

例:

public class ValuesController : ApiController
{
    // GET /api/values
    public IEnumerable<string> Get()
    {
        // returns /api/values/123
        string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
        return new string[] { "value1", "value2" };
    }

    // GET /api/values/5
    public string Get(int id)
    {
        return "value";
    }

    ...
}

此UrlHelper在您的视图和标准控制器中都不存在。


更新:

为了在ApiController之外进行路由,您可以执行以下操作:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string url = Url.RouteUrl(
            "DefaultApi", 
            new { httproute = "", controller = "values", id = "123" }
        );
        return View();
    }
}

或视图内:

<script type="text/javascript">
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
    $.ajax({
       url: url,
       type: 'GET',
       success: function(result) {
           // ...
       }
    });
</script>

请注意httproute = ""重要的路由令牌。

显然,这假定您的Api路由是DefaultApi在的RegisterRoutes方法中调用的Global.asax

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

那真的对我没有太大帮助,因为我需要View能够以安全的方式生成Urls。如果有Go Live许可证,在View上创建URL的“ Go Live”方式是什么?
Shane Courtrille 2012年

更重要的是,如果您使用的是ASP.Net Development Server,这将无法正常工作,因为它一直在更改端口,因此您甚至无法在视图中添加URL。
Shane Courtrille 2012年

@ShaneCourtrille,我更新了答案以说明如何使用普通System.Web.Mvc.UrlHelper方法在HttpControllerContext外部生成Api路由。
Darin Dimitrov

非常感谢!我正在尝试使用RouteUrl,但不了解httproute参数要求。
Shane Courtrille'2

2
我了解样本的目的;我的意思是,如果您放入一行ViewBag代码,这将是一个更有用的示例,因为您将证明此值是我们在可能的情况下尝试获得的值,而不仅仅是执行一些任意代码。再说一次,如果我没有浪费几分钟没有意识到自己错过的东西,那么在我最终意识到特定的代码行是相关的之前,我不会发表评论。
乔恩·戴维斯

43

它以更简单的形式工作,Url.Action因此您不必引用任何路由名称:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

area = ""如果区域中需要URL,则可能需要添加一个。(默认情况下,Api控制器不在区域内。)我正在使用MVC 4。


7
Web Api中的UrlHelper是msdn.microsoft.com/en-us/library/…,它没有操作方法。
Yuriy Faktorovich

8
@YuriyFaktorovich这篇文章暗示Url.Action正在被View使用。Url属于类型System.Web.Mvc.UrlHelper,并且不会映射到WebApi路线。这就是为什么您需要额外的参数的原因new { httproute = "" }
杰西

3
我已经添加了,httproute""但它没有映射= /
Maslow

我必须添加具有空白区域和空htmlAttributes的链接,@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) 但效果很好
Christopher G. Lewis

2
从一个角度来看,这是完美的方法,但是,我不确定为什么它将动作的名称生成为查询字符串,例如:/ api / dashboard?action = getdata。我期望这样:/ api / dashboard / getdata
umutesen '16

7

是否希望能够以类型安全的方式生成链接,而无需使用硬编码的字符串(控制器名称)?

有一个小问题!(由马克·西曼(Mark Seeman)撰写)

https://github.com/ploeh/Hyprlinkr

像这样工作:

路线,照常:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

获取网址:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

结果:

http://localhost/api/foo/1337

3

这是回答问题的KISS方法:

如果这是用于创建MVC控制器URL的代码

@Url.Action("Edit", "MyController")

为了获取控制器的API版本的URL(假设您使用相同的控制器名称),可以使用

@Url.Action("Edit", "api/MyController")

Url.Action方法所做的全部工作是在应用程序的根路径后附加控制器名称,后跟操作名称(除非它是“ Index”,在这种情况下不附加该名称)。如果路由值对象具有id属性值也会附加到URL。


谢谢!我缺少api/控制器名称之前的。
丹尼尔·康格罗夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.