#c# #.net #asp.net-mvc #entity-framework
#c# #.net #asp.net-mvc #entity-framework
Вопрос:
Я абсолютный новичок в .NET и я не могу это исправить.
В настоящее время у меня есть это:
Hotel.cs (модель)
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Hotels.Models
{
public class Hotel
{
[Key]
public int Id { get; set; }
[Required]
public string name { get; set; }
[Required]
public string city { get; set; }
[Required]
public string image { get; set; }
[Required]
public string category { get; set; }
[Required]
public string description { get; set; }
[Required]
public string features { get; set; }
public bool featured {get; set; }
}
}
Затем в моем контроллере у меня есть функция, которая выполняет поиск отеля по его идентификатору
[HttpGet("{id}",Name="GetHotelById")]
public ActionResult<HotelReadDto> GetHotelById(int id)
{
var hotelItem = _repository.GetHotelById(id);
if(hotelItem != null)
{
return Ok(_mapper.Map<HotelReadDto>(hotelItem));
}
return NotFound();
}
Функции определены в этом интерфейсе:
using System.Collections.Generic;
using Hotels.Models;
namespace Hotels.Data
{
public interface IHotelsRepo
{
bool SaveChanges();
IEnumerable<Hotel> GetAllHotels();
Hotel GetHotelById(int id);
void UpdateHotel(Hotel cmd);
}
}
И именно здесь реализован интерфейс
public Hotel GetHotelById(int id)
{
return _context.Hotels.FirstOrDefault(p => p.Id == id);
}
Прямо сейчас, если я выполняю поиск по идентификатору, например
GET /api/hotels/1
он возвращает значение.
Если во всех вышеперечисленных функциях я изменяю (int id), по (string name) и последнему, я ищу
GET /api/hotels/hotel1
Он всегда возвращает 404.
Это то, что я в основном изменяю
Контроллер
public ActionResult<HotelReadDto> GetHotelById(string name)
{
var hotelItem = _repository.GetHotelById(string name);
if (hotelItem != null)
{
return Ok(_mapper.Map<HotelReadDto>(hotelItem));
}
return NotFound();
}
Интерфейс
Hotel GetHotelById(string name);
И затем репозиторий
public Hotel GetHotelById(string name)
{
return _context.Hotels.FirstOrDefault(p => p.name == name);
}
Но он по-прежнему возвращает 404, я немного запутался, как я мог бы изменить его, чтобы искать name вместо id
Комментарии:
1. Ваше приложение вызывает правильный URL? 404 означает, что API не был найден. Вероятно, проблема с конфигурацией. Не так много с вашим кодом… Проверьте, запущен ли ваш API. Проверьте правильность конфигурации / env.
Ответ №1:
Является ли атрибут над методом по-прежнему следующим?
[HttpGet("{id}",Name="GetHotelById")]
public ActionResult<HotelReadDto> GetHotelById(string name)
Если да, попробуйте изменить его на это:
[HttpGet("{name}",Name="GetHotelById")]
public ActionResult<HotelReadDto> GetHotelById(string name)
Ответ №2:
Вы должны поместить атрибут конфигурации маршрута в метод действия или вам нужно изменить маршрут в конфигурации маршрута.