【发布时间】:2013-03-04 03:34:42
【问题描述】:
我的路线:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = @"^\d+$" }
);
routes.MapHttpRoute(
name: "ApiControllerActionRoute",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我的方法:
// GET api/Set/All
[ActionName("All")]
public IEnumerable<Set> GetSets()
{
var sets = _repository.GetAllSets();
return sets;
}
// GET api/Set/TopLevelSets
[ActionName("TopLevelSets")]
public IEnumerable<Set> GetTopLevelSets()
{
var sets = _repository.GetTopLevelSets();
return sets.ToList();
}
// GET api/Set/Breadcrumbs/1
[ActionName("Breadcrumbs")]
public IEnumerable<Set> GetBreadCrumbs(int id)
{
var sets = _repository.GetBreadcrumbs(id);
return sets.ToList();
}
// GET api/Set/5
public Set GetSet(int id)
{
Set set = _repository.GetSet(id);
if (set == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return set;
}
// PUT api/Set/5
public HttpResponseMessage PutSet(Set set)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
_repository.UpdateSet(set);
return Request.CreateResponse(HttpStatusCode.OK);
}
// POST api/Set
public HttpResponseMessage PostSet(Set set)
{
if (ModelState.IsValid)
{
_repository.AddSet(set);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, set);
return response;
}
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
// DELETE api/Set/5
public HttpResponseMessage DeleteSet(int id)
{
_repository.DeleteSet(id);
return Request.CreateResponse(HttpStatusCode.OK, id);
}
此时我正在尝试使用 localhost/api/set/1 - getSet 方法。一切似乎都与路线一致,但由于某种原因它不起作用。我错过了什么?
【问题讨论】:
-
这是伪代码,还是剪切粘贴?您的 GetSet Action 缺少 ActionName 注释:[ActionName("Set")],因此 GetSet 与您正在寻找的 Set 路线不匹配
-
剪切和粘贴 - 这不会打第一条路线并说控制器 = Set 和 id = 1?在我添加非标准方法和第二条路线注册之前,这是可行的。如果我添加 Action 注释,那么我不需要点击 /api/set/set/1 吗?
-
否 - 操作名称属性实际上会将名称 GetSet 替换为您想要的名称“Set”。通过使用 [ActionName("Set")] 它将具有路由 /api (controller)/set (action) /1 (id) - 匹配您的 GetSet Action。或者,您可以将您的操作从 GetSet 重命名为 Set(无论如何这可能更容易理解)
-
很抱歉我没有包含这个 - 我的控制器被命名为“SetController”。我正在通过 /api/set/all 访问 All - 但 api/set/1 给了我这个错误。这有什么不同吗?
标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 routes