У меня есть то, что я считаю стандартным контроллером:
Вот определение контроллера (небольшая инъекция зависимостей, но стандартная):
public class SeriesController : Controller
{
private readonly IHostingEnvironment _env;
public SeriesController(IHostingEnvironment env)
{
_env = env;
}
[HttpGet("/series/{id:int?}/{title?}")]
public IActionResult Index(int id, string title)
{
if (id > 0)
{
var populateSeriesItem = new PopulateSeriesItem(_env, new SqlConnection());
var seriesItem = populateSeriesItem.GenerateSeriesItem(id);
//...
Если id отсутствует (или 0), то отображаются все записи; если 1 или больше, отображается одна запись. (Так хочет клиент!)
Я называю это так:
https: // локальный / серия / 3 / заголовок
или
https: // локальный / серия / 4 /
но проблема в том, что идентификатор всегда равен 0 (а заголовок равен нулю).
Это произойдет, если я введу его в адресную строку или укажу идентификатор вручную (например, / series? Id = 3)
Я просто не могу понять, что мне не хватает.
Та же самая настройка отлично работает с другим контроллером.
[HttpGet("/books/{id:int?}/{title?}")]
public ActionResult Index(int id, string title)
{
if (id > 0)
{
var populateBookItem = new PopulateBookItem(new SqlConnection(), _env);
var bookItem = populateBookItem.GenerateBookItem(id);
Этот работает.
Это конфигурация маршрутизации (стандартная):
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Должно быть, я упускаю что-то очевидное, но я сбит с толку!
Любой совет очень ценится.
Обновлять:
Я убрал с контроллера всю функциональность. Я просто передаю это взгляду.
Это работает: https: // localhost: 44319 / series / 14 / мегаполисы - представление сообщает id = 14.
Это работает: https: // localhost: 44319 / series / 5 / мегаполисы - представление отчетов id = 5
Это работает: https: // localhost: 44319 / series / 14 / business-with-china - представление сообщает id = 14.
Не работает: https: // localhost: 44319 / series / 5 / business-with-china - переходит в https: // локальный: 44319 / серия / 0.
Есть и другие URL-адреса, которые следуют тому же шаблону. Некоторые работают, некоторые не работают.
Если я уберу параметр заголовка, все они будут работать.
Понятия не имею, почему!
Я добавил это выше! Спасибо.
Вы пробовали поставить [FromRoute] перед своими параметрами?
Спасибо. [FromRoute} не имеет никакого значения. :(
Извините, какая косая черта в начале? - Значит, он читает series / {id; int?} / {Title?}





routes.MapRoute, это не обязательно для веб-API.[HttpGet("/books/{id:int?}")]api/books/5?title=abc [HttpGet("/books/{id:int?}")]
public ActionResult Index(int id, [FromQuery] string title)
{
//code here
}
Это не веб-API. Стандартный MVC.
@ user5956088 понял. у нас есть два способа указать маршрут: MapRoute или атрибуты. Вы можете оставить MapRoute для обычных ситуаций и изменить атрибут, как я сказал.
Это работает! Большое спасибо!
Спасибо всем за помощь.
Я решил проблему, хотя не знаю, чем она была вызвана. (Я думаю, это могла быть проблема с кешированием браузера.)
Как бы то ни было, я перезапустил сервер, и теперь все работает как надо.
Если есть несоответствие в именах, параметр будет разрешен как значение по умолчанию - 0 в случае чисел и null в противном случае В приведенном ниже примере url имеет param1, тогда как у метода есть имя параметра param2.
[HttpGet("/foo/{param1}")]
public ActionResult Foo(int param2)
{
//code here
}
У меня была такая же проблема, поэтому я нашел эту ссылку. Я случайно нашел решение своей проблемы, так что даже оно не связано с вашим, я отправляю его для всех, кто приходит сюда, у кого может быть такая же проблема, как и у меня. Я использую C# и .net Core 2.2 Независимо от того, что я делал, я получал значение id равным 0. Случилось так, что выбранное мной имя параметра, которое было "page", номер страницы, должно было иметь "id" то же имя, что и указанное в {id?}
Можете ли вы поделиться конфигурацией маршрутизации?