CreatedAtRoute создает исключение: «Ни один маршрут не соответствует предоставленным значениям». - PullRequest
0 голосов
/ 24 октября 2019

Использование моих функций Post для создания строк в таблицах генерирует ответ 500 И записывает данные. Тело ответа - это html, и ошибка выглядит следующим образом:

<h1>An unhandled exception occurred while processing the request.</h1>
            <div class="titleerror">InvalidOperationException: No route matches the supplied values.</div>
                <p class="location">Microsoft.AspNetCore.Mvc.CreatedAtRouteResult.OnFormatting(ActionContext context)</p>

Очевидно, моя ошибка возникает при моем ответе CreatedAtRoute.

У меня трудное времяточно понимая, что делает пост и как должны генерироваться ссылки для новых записей в таблицах.

Я использую сваггер для вызова своих конечных точек.

Я попытался прочитать о том, как генерировать ссылки, нопонятия топят меня. Я попытался возиться с ответом CreatedAtRoute, но не могу понять, какие параметры мне нужно отправить, или что именно он делает.

Контроллер:

[ProducesResponseType(typeof(Location),200)]
        [HttpGet("locations/{locationId}", Name = "LocationById")]
        public IActionResult GetLocation(int locationId)
[HttpPost("locations")]
        public IActionResult CreateLocation([FromBody] CreateLocationRequest createLocationRequest)
        {
            try
            {
                if (createLocationRequest == null)
                {
                    return NotFound();
                }

                return CreatedAtRoute("LocationById",_repository.Location.CreateLocation(createLocationRequest),createLocationRequest);
            }
            catch (Exception e)
            {
                return StatusCode(500, e.InnerException);
            }
        }

Репозиторий:

public int CreateCompany(string name, int countryId, int? parentId)//string name, int countryId, int? parentId
        {
            Company company = new Company()
            {
                CountryId = countryId,
                Name = name,
                ParentId = parentId
            };
            _context.Companies.Add(company);
            _context.SaveChanges();
            return company.Id;
        }

Конфигурация стартового маршрута:

app.UseHttpsRedirection();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

Мне нужен правильный маршрут в направлениимои недавно созданные записи в таблице. Любые предложения о том, как получить это, будут чрезвычайно признательны.

После прочтения немного о CreatedAtRoute я попытался настроить свои функции, чтобы попытаться увидеть, будет ли проходить сама сущность вместо модели при вызове CreatedAtRoute. что-нибудь, чтобы помочь моему делу. Это не так.

Новые методы: Репозиторий:

public LocationReturns CreateLocation(CreateLocationRequest createLocationRequest)
        {
            if (_context.Companies.FirstOrDefault(c => c.Id == createLocationRequest.CompanyId) != null)
            {
                LocationReturns locationReturns=new LocationReturns();
                Location location = new Location()
                {
                    Address = createLocationRequest.Address,
                    AllowedAsSource = createLocationRequest.AllowedAsSource,
                    City = createLocationRequest.City,
                    CompanyId = createLocationRequest.CompanyId,
                    Name = createLocationRequest.Name,
                    Picture = createLocationRequest.Picture,
                    PostCode = createLocationRequest.Postcode,
                    Region = createLocationRequest.Region
                };
                _context.Locations.Add(location);
                _context.SaveChanges();
                locationReturns.id = location.Id;
                locationReturns.loc = location;
                return locationReturns;
            }
            LocationReturns loc = new LocationReturns();
            return loc;
        }

Контроллер:

[HttpPost("locations")]
        public IActionResult CreateLocation([FromBody] CreateLocationRequest createLocationRequest)
        {
            try
            {
                if (createLocationRequest == null)
                {
                    return NotFound();
                }
                LocationRepository.LocationReturns locationReturns=new LocationRepository.LocationReturns();
                locationReturns = _repository.Location.CreateLocation(createLocationRequest);

                return CreatedAtRoute("DefaultApi",new {id=locationReturns.id}, locationReturns.loc);
            }
            catch (Exception e)
            {
                return StatusCode(500, e.InnerException);
            }
        }

Где LocationReturns - это структура.

1 Ответ

0 голосов
/ 24 октября 2019

Анонимный объект, сгенерированный внутри CreateAtRoute(), должен иметь int prop с тем же именем, что и параметр, объявленный в маршруте. Пример: [HttpGet("/locations/{locationId}, Name="LocationCreated" требует CreatedAtRoute("LocationCreated", new {locationId=id}, locationObject); вместо CreatedAtRoute("LocationCreated", new {id=_id}, locationObject);

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