hyp*_*erN 1 c# asp.net asp.net-web-api asp.net-web-api2
我有像这样配置的路由:
routes.MapHttpRoute("DefaultApi2", "api/{controller}/{action}/{id}", new {id = RouteParameter.Optional}
Run Code Online (Sandbox Code Playgroud)
我的控制器看起来像这样:
public class RoutineController : ApiController
{
private readonly RoutineService _routineService;
public RoutineController(RoutineService routineService)
{
_routineService = routineService;
}
[HttpGet]
[ActionName("Tags")]
public List<RoutineTag> Tags()
{
return _routineService.GetAllTags();
}
[HttpGet]
[ActionName("SingleRoutine")]
// GET api/routine/5
public RoutineViewModel SingleRoutine(int id)
{
return _routineService.GetRoutineById(id);
}
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误:
{"Message":"The request is invalid.","MessageDetail":"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'Infrastructure.Api.Models.RoutineViewModel Routine(Int32)' in 'Infrastructure.Api.Controllers.RoutineController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."}
Run Code Online (Sandbox Code Playgroud)
如果我将方法SingleRoutine更改为:
[HttpGet]
[ActionName("SingleRoutine")]
// GET api/routine/5
public RoutineViewModel SingleRoutine(int? id)
{
if (!id.HasValue)
{
return null;
}
return _routineService.GetRoutineById((int) id);
}
Run Code Online (Sandbox Code Playgroud)
在浏览器中我只看到"null".
为什么会这样?
编辑
键入/ api/routine/tags时会显示此错误
我相信这是WebApiConfig中的问题我有以下几行:
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}
);
config.Routes.MapHttpRoute("CustomApi", "{controller}/{action}/{id}", new {id = RouteParameter.Optional}
);
Run Code Online (Sandbox Code Playgroud)
并在Route Config中
routes.MapHttpRoute("DefaultApi2", "api/{controller}/{action}/{id}", new {id = RouteParameter.Optional}
Run Code Online (Sandbox Code Playgroud)
现在在WebApiConfig我有:
config.Routes.MapHttpRoute("CustomApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}
);
Run Code Online (Sandbox Code Playgroud)
在RouteConfig中:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
它的工作原理!