Jon
Jon

Reputation: 491

Error : UrlHelper.Link must not return null

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

Answers (1)

Tetsuya Yamamoto
Tetsuya Yamamoto

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

Related Questions