mvc中强类型的web api路由端点

时间:2015-08-14 16:26:33

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

所以我有两个独立的项目(一个Web Api 2和一个MVC),如下图所示:enter image description here

MVC具有控制器和服务层。 MVC应用程序的服务调用web api控制器。例如:

await _service.GetGiftCards("/api/GiftCards/ViewAllByUser", email);

Web Api控制器的路由定义如下:

[RoutePrefix("api/giftcards")]
[Route("ViewAllByUser")]
    public async Task<List<GiftCard>> GetGiftCardsForUser(string email){}

因此,要在MVC应用程序中定义端点路由,我只需传递一个字符串,如&#34; / api / GiftCards / ViewAllByUser&#34;上方。

我的问题是,是否有更好的方式来排序&#34;强类型&#34;定义的Web Api路由的端点,以便我可以执行类似的操作:

await _service.GetGiftCards(GiftCardController.ViewAllByUser, email);

我想我至少可以将端点字符串存储在静态类中,所以它们至少可以在一个地方更新:

public static class ApiEndpoints(){
     public string GetAllGiftCards = "api/GiftCards/ViewAllByUser";
}

但我想知道是否有更好的方法或其他建议。谢谢!

3 个答案:

答案 0 :(得分:3)

API路由不应指定操作。您希望路由成为记录或记录组的逻辑路径。例如,在您的情况下,路线应如下所示:

GET
api/giftcards/{userID:int:min(1)}

您希望能够基本上走上网址并获得您期望的结果。在示例路线的情况下,您将获得基于用户ID的礼品卡。如果您要取消用户ID页面并只需拨打api / giftcards,您就可以获得所有用户的所有礼品卡。我在这里使用的是ID,但你会对电子邮件做同样的事情。

答案 1 :(得分:0)

请尝试使用&#39; ActionName&#39;像这样的行动属性:

 [ActionName("SelectAll")]
        public IEnumerable<Customer> Get()
        {
       ...
        }

将此操作名称称为:

$("#getdata").click(function () {
  var options = {};
  options.url = "/api/customer/SelectAll";
  options.type = "GET";
  ...
  ...
  $.ajax(options);
});

注意:&#39; getdata&#39;是控件的id,将触发哪个点击事件并调用&#39; api方法&#39;和来自api的getdata

答案 2 :(得分:0)

Here's a library可能是您正在寻找的内容。

虽然我喜欢静态字符串,但您不必总是向团队中的未来开发人员展示如何在客户端需要更新时使用该库。