122

在 ASP.NET MVC 中,我们有@Url.Actionfor 操作。有没有类似的东西@Url.Api会路由到/api/controller?

4

4 回答 4

142

ApiController有一个名为Url的属性,它的类型为System.Web.Http.Routing.UrlHelper,它允许您为 api 控制器构造 url。

例子:

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 }
);
于 2012-02-29T16:03:57.347 回答
46

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

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

area = ""如果区域内需要 URL,您可能需要添加一个。(默认情况下,Api 控制器位于区域之外。)我使用的是 MVC 4。

于 2013-07-25T14:41:07.663 回答
8

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

有一个小窍门!(这是马克西曼写的)

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
于 2015-11-16T14:43:37.150 回答
4

下面是回答问题的 KISS 方法:

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

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

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

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

Url.Action 方法所做的只是附加应用程序的根路径,带有控制器名称,后跟操作名称(除非它是“索引”,在这种情况下不附加它。如果路由值对象有一个 id属性值也附加到 URL。

于 2017-10-04T18:13:51.347 回答