0

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

我希望 URL 看起来像这样

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

编辑 30-10-2013

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

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

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

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

但它不适用于最后一个 URL

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

有人可以推动我朝着正确的方向前进吗 ;-)

提前致谢

安德斯·佩德森

4

2 回答 2

0

假设该类的名称为VacationController,那么这些方法的默认路由将类似于:

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

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

于 2013-10-28T11:14:40.440 回答
0

添加默认操作 = "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 }
        );
    }
于 2013-10-28T12:20:58.527 回答