在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
答案 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 }
);
}