如何创建ASP.NET Web API Url?

Sha*_*lle 118 asp.net-mvc-4 asp.net-web-api

在ASP.NET MVC中,我们有@Url.Action行动.有类似的东西@Url.Api会路由到/ api/controller吗?

Dar*_*rov 137

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";
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

此UrlHelper既不存在于您的视图中,也不存在于标准控制器中.


更新:

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

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

或在视图内:

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

注意httproute = ""路线令牌很重要.

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

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

  • 我理解样本的目的; 我说这是一个更有用的示例,如果你投入一行ViewBag代码,因为你会证明*这个值是我们试图在可能的情况下得到的*而不仅仅是执行一些任意代码.再说一次,如果我没有浪费几分钟没有意识到我错过了什么,我终于认识到特定的代码行是相关的代码,我就不会评论. (2认同)

Gáb*_*mre 44

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

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Run Code Online (Sandbox Code Playgroud)

area = ""如果区域内需要URL,您可能需要添加.(默认情况下,Api控制器在区域之外.)我正在使用MVC 4.

  • Web Api中的UrlHelper是http://msdn.microsoft.com/en-us/library/system.web.http.routing.urlhelper(v=vs.108).aspx,它没有动作方法. (7认同)
  • @YuriyFaktorovich这篇文章暗示了从视图中使用`Url.Action`.`url`是`System.Web.Mvc.UrlHelper`类型,它不映射到`WebApi`路由.这就是你需要额外参数的原因:`new {httproute =""}`. (7认同)
  • 我添加了`httproute""`但它不是映射= / (3认同)
  • 这在视图中工作得很好,但是,我不确定为什么它会将操作的名称生成为查询字符串,如:/ api/dashboard?action = getdata.我期待这个:/ api/dashboard/getdata (2认同)

Cri*_*scu 6

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

这有一个难题!(它由Mark Seeman撰写)

https://github.com/ploeh/Hyprlinkr

像这样工作:

路线像往常一样:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Run Code Online (Sandbox Code Playgroud)

获取网址:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Run Code Online (Sandbox Code Playgroud)

结果:

http://localhost/api/foo/1337
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

@Url.Action("Edit", "MyController")
Run Code Online (Sandbox Code Playgroud)

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

@Url.Action("Edit", "api/MyController")
Run Code Online (Sandbox Code Playgroud)

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