Reputation: 491
I am creating REST Services. Here I want to create a Post service. Data is inserted into a database, but in response I got this error
UrlHelper.Link must not return null..
My Code
[HttpPost]
[Route("api/CourseRegistrations")]
[ResponseType(typeof(CourseRegistration))]
public IHttpActionResult PostCourseRegistration(CourseRegistration courseRegistration)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.CourseRegistrations.Add(courseRegistration);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = courseRegistration.course_id }, courseRegistration);
}
Upvotes: 0
Views: 982
Reputation: 24957
I assumed you're using default setting inside WebApiConfig
class in App_Start
folder like this:
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Thus it is necessary to provide controller name parameter in CreatedAtRoute
method, as in example below:
return CreatedAtRoute("DefaultApi", new { controller = "ApiControllerName", id = courseRegistration.course_id }, courseRegistration);
However, since RouteAttribute
is present, it indicates that attribute routing is enabled, then you should provide route name for GET route with proper parameter name and then set POST route as shown in example below:
// 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);
}
Note:
1) The parameter name contained inside CreatedAtRoute
must match with target parameter name used in action method, otherwise the UrlHelper.Link()
method will return null.
2) The route name in RouteAttribute
should be different from action method name to avoid confusion.
Reference:
Attribute Routing in ASP.NET Web API 2: Route Names
Related issue:
Attribute Routing and CreatedAtRoute
Upvotes: 1