Web api路由具有不同参数的多个操作

时间:2013-10-28 07:42:43

标签: asp.net

在ASP.NET Web api项目中,我有一个VacationController,我想使用这些操作方法。 我如何构建实现此目的的路线?

    public Enumerable<Vacation> GetVacation()
    {
        // Get all vactions

        return vacations;
    }

    public Vacation GetVacation(int id)
    {
        // Get one vaction

        return vacation;
    }

    public Enumerable<Vacation> ByThemeID(int themeID)
    {
        // Get all vactions by ThemeID

        return vacations;
    }

我希望网址看起来像这样

/api/vacation             // All vacations
/api/vacation/5           // One vacation
/api/vacation/ByThemeID/5 // All vacations from one theme

编辑30-10-2013

我尝试过Pasit R路线,但我无法上班。我确实尝试了我能想到的每一种组合。

这就是我所知道的。如您所见,我在路线的bein处添加了一个额外的参数。我意识到我需要这样才能分开在不同标签上出售的假期。

以下是我使用的路线。并且这些URL的工作正常

/api/vacation             // All vacations
/api/vacation/5           // One vacation
/api/vacation/ByThemeID/5 // All vacations from one theme

但它不适用于最后一个网址

       config.Routes.MapHttpRoute(
            name: "DefaultApiSimbo",
            routeTemplate: "api/{label}/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

这是我在VacationController中的Action方法

// ByThemeID api/{label}/Vacation/ByThemeId/{id}
    [HttpGet]
    public IEnumerable<Vacation> ByThemeID(string label, int id)
    {
        return this.repository.Get(label);
    }

    // GET api/{label}/Vacation
    public IEnumerable<Vacation> GetVacation(string label)
    {
        return repository.Get(label);
    }

    // GET api/{label}/Vacation/{id}
    public Vacation GetVacation(string label, int id)
    {
        Vacation vacation;
        if (!repository.TryGet(label, id, out vacation))
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
        return vacation;
    }

有人可以向我推进正确的方向; - )

提前致谢

Anders Pedersen

2 个答案:

答案 0 :(得分:0)

假设该类名为 VacationController ,则这些方法的默认路由如下所示:

 /api/Vacation/GetVacation
 /api/Vacation/GetVacation?id=1
 /api/Vacation/ByThemeID?id=1

这都是假设路由已更新注释。

答案 1 :(得分:0)

添加默认值action =“GetVacation”并将id设为可选

ApiController基类可以自动处理重载GetVacation()GetVacation(int id)选择。

注册WebApiConfig

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{*param}",
            defaults: new { action = "Get", param = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "Vacation",
            routeTemplate: "api/vacation/{action}/{*id}",
            defaults: new { controller = "Vacation", action = "GetVacation", id = RouteParameter.Optional }
        );
    }