我正在使用 Web Api 2.0 和 MVC 5
这是我的 WebApiConfig
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这是我的控制器:
public class PartesController : ApiController
{
public IHttpActionResult Get(int? id)
{
try
{
using (HornosContext db = new HornosContext())
{
if (id == null || id == 0)
{
return Ok(db.Partes.ToList());
}
else
{
return Ok(db.HornosPartes.Where(ph => ph.IdHorno == id).Select(ph => ph.Parte).ToList());
}
}
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
}
- 调用
http://blabla/api/partes/1
时有效 - 当我打电话
http://blabla/api/partes
给我404 NOT FOUND
如果我从操作中删除参数:
public IHttpActionResult Get()
{
try
{
using (HornosContext db = new HornosContext())
{
return Ok(db.Partes.ToList());
}
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
和命令调用这样的方法:http://blabla/api/partes
它有效。
为什么 Web API 不将 id 标识为可选值?
编辑:
我知道我可以添加属性和更多操作,但由于事情如此简单,我希望它可以与默认路由一起使用。
在作为重复提出的问题中,问题与路由配置的注册顺序有关,这里我通过为操作参数指定默认值来解决它(请参阅下面的答案)
如果您使用
Web Api 2
使用属性来映射使用[Route]
这种方式,您可以创建两个动作接收或不接收id
ASP.NET Web API 2 中的属性路由
我只需要为方法参数指定一个默认值就可以了