Роутинг в ASP.NET Core

Всем привет. В _Layout.cshtml возникает проблема со строкой Products/List. Когда запускаю сайт и нажимаю на вкладку Products, то нет переадресации в секцию лист и выдает ошибку 404.Вместо адресного пути указанного в _Layout.cshtml (asp-action="Products/List"), он выдает "Products%2FList". Проблема связана с настройками роутинга? Однако если вбивать полный адрес вручную: https://localhost:44332/Products/List, то контроллер находит без проблем.

Layout:

        <ul class="navbar-nav flex-grow-1">
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
            </li>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Products/List">Products</a>
            </li>

Контроллер:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace AppForPryaniki.Controllers
{
    public class ProductsController : Controller
    {
        private ProductReader reader;


        public ProductsController()
        {
            reader = new ProductReader();
        }

        // Products/List
        public IActionResult List()
        {
            List<Product> products = reader.ReadFromFile();

            return View(products);
        }

        // Products/Details/1
        public IActionResult Details(int id)
        {
            List<Product> products = reader.ReadFromFile();
            Product product = products.Where(x => x.Id == id).FirstOrDefault();

            if (product != null)
            {

                return View(product);
            }
            else
            {
                return NotFound();
            }
        }
    }
}

Настройки роутинга:

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

HomeController

namespace AppForPryaniki.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {

            Product product = new Product();
            product.Id = 1;
            product.Name = "Test";

            return View(product);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
        public IActionResult Products()
        {
            return View();
        }


        public IActionResult Test()
        {
            return View();
        }

    }
}

Ответы (1 шт):

Автор решения: Xamdi59

Там где asp-area пиши default (не обязательно так как asp.net сам это понимает). Там где asp-controller пиши название контроллера в котором лежит нужный тебе метод. Либо Home, либо Products Там где asp-action пиши название метода куда ты обращаешься. Для Home контроллера Index, Privacy, Error, Products, Test Для Products контроллера List, Details.

То есть, вместо

<li class="nav-item">
      <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Products/List">Products</a>
</li>

Напиши

<li class="nav-item">
      <a class="nav-link text-dark" asp-controller="Products" asp-action="List">Products</a>
</li>

Должно заработать, если я правильно понял что тебе нужно

→ Ссылка