c# ASP.NET 核心中的路由

Posted

技术标签:

【中文标题】c# ASP.NET 核心中的路由【英文标题】:Routing in c# ASP.NETcore 【发布时间】:2021-09-07 10:33:27 【问题描述】:

_Layout 中的 Products/List 字符串存在问题。 .cshtml。当我启动站点并单击“产品”选项卡时,没有重定向到工作表部分,并且出现 404 错误。而不是 _Layout 中指定的地址路径。 cshtml (asp-action="Products/List"),它输出"Products%2FList"。问题与路由设置有关吗?但是,如果手动输入完整地址:https://localhost:44332/Products/List,那么控制器会毫无问题地找到它。

布局:

    <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?");
            );
        
    

家庭控制器

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】:

这里有两个错误:

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

首先,您希望路由到您的ProductsController 上的操作,因此Home 是用于asp-controller 的错误值。相反,您想使用Products

其次,asp-action 的值也是错误的,因为您想要的操作称为List,而不是Products/List。正确的值为List

以下是更改后的样子:

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

当您检查https://localhost:44332/Products/List 以查看它是否有效时,您已经自行解决了一半。当您能够直接导航到类似的内容时,这始终表明您尝试在视图中生成的链接就是问题所在。

【讨论】:

【参考方案2】:

Controller 和 Action 的名称不正确。 asp-controller 应该是 Productsasp-action 应该是 List

【讨论】:

以上是关于c# ASP.NET 核心中的路由的主要内容,如果未能解决你的问题,请参考以下文章

JWT:如何从声明中的特定键获取值列表。 C# Asp.Net 核心

asp.net MVC路由问题? 删除默认路由可以正常访问 路由配置请看下面内容 asp.net?dotNet编程? C#语言编程

ASP.NET MVC教程五:ASP.NET MVC中的路由

Asp.net核心默认路由

ASP.net Core API 中的路由

使用asp.net核心的控制器和路由问题