Я предположил, что вы используете настройку по умолчанию внутри класса WebApiConfig
в папке App_Start
, например:
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Таким образом, необходимо предоставить параметр имени контроллера в методе CreatedAtRoute
, как впример ниже:
return CreatedAtRoute("DefaultApi", new { controller = "ApiControllerName", id = courseRegistration.course_id }, courseRegistration);
Однако, поскольку присутствует RouteAttribute
, это означает, что маршрутизация атрибута включена, тогда вы должны предоставить имя маршрута для маршрута GET с правильным именем параметра, а затем установить маршрут POST, как показано впример ниже:
// GET method
[HttpGet]
[Route("api/CourseRegistrations/{id}", Name = "GetCourseRegistrationById")]
[ResponseType(typeof(CourseRegistration))]
public IHttpActionResult GetCourseRegistration(int id)
{
// do something
}
// POST method
[HttpPost]
[Route("api/CourseRegistrations")]
public IHttpActionResult PostCourseRegistration(CourseRegistration courseRegistration)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.CourseRegistrations.Add(courseRegistration);
db.SaveChanges();
// replace 'DefaultApi' with route name for redirect to GET method
return CreatedAtRoute("GetCourseRegistrationById", new { id = courseRegistration.course_id }, courseRegistration);
}
Примечание:
1) Имя параметра, содержащееся в CreatedAtRoute
, должно совпадать с именем целевого параметра, используемого в методе действия, в противном случае UrlHelper.Link()
метод возвратит ноль.
2) Имя маршрута в RouteAttribute
должно отличаться от имени метода действия, чтобы избежать путаницы.
Ссылка:
Маршрутизация атрибутов в ASP.NET Web API 2: Имена маршрутов
Связанная проблема:
Маршрутизация атрибутов и CreatedAtRoute