Ошибка: UrlHelper.Link не должен возвращать ноль - PullRequest
0 голосов
/ 31 декабря 2018

Я новичок в c # .net.Я создаю REST-сервисы здесь. Я хочу создать Post-service данные вставляются в базу данных, но в ответ я получил эту ошибку UrlHelper.Link must not return null..

Мой код

  [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);
    }

1 Ответ

0 голосов
/ 02 января 2019

Я предположил, что вы используете настройку по умолчанию внутри класса 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...