asp.net core MVC路由添加.html伪静态url时报错


asp.net core mvc希望 url链接中以 .html结尾,伪静态效果

路由配置如下

C# 全选
endpoints.MapControllerRoute(
	name: "default_page",
	pattern: "{controller}/{action}.html",
	defaults: new { controller = "Home", action = "list" });

控制器代码为

C# 全选
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;

namespace YESCMS.Controllers
{
    public class IssuesCenterController : ControllerBase
    {
        public IssuesCenterController()
        {
        }

        public class IndexViewModel
        {
            public int PageIndex { get; set; }
            public int PageTotal { get; set; }
            public List<ItemModel> Data { get; set; }

            public class ItemModel
            {
                public string ID { get; set; }
                public string Title { get; set; }
                public DateTime CreateTime { get; set; }
                public string CreateUser { get; set; }
                public string CreateUserName { get; set; }
                public bool IsOpen { get; set; }
                public int Status { get; set; }
            }
        }
        public IActionResult List(string filter = "", int page = 1)
        {
            var query = entities.data_Issues.AsNoTracking().OrderByDescending(o => o.CreateTime);
            int pageSize = 20;
            var total = query.Count();

            IndexViewModel viewModel = new IndexViewModel();
            viewModel.PageTotal = total / pageSize + (total % pageSize > 0 ? 1 : 0);
            viewModel.Data = (from a in query.Skip((page - 1) * pageSize).Take(pageSize)
                              join b in entities.sys_User on a.CreateUser equals b.UserID
                              orderby a.CreateTime descending
                              select new IndexViewModel.ItemModel()
                              {
                                  ID = a.ID,
                                  CreateTime = a.CreateTime,
                                  CreateUser = a.CreateUser,
                                  Status = a.Status,
                                  Title = a.Title,
                                  CreateUserName = b.UserName,
                                  IsOpen = a.IsOpen
                              }).ToList();


            return View(viewModel);
        }
        /// <summary>
        /// 添加提问
        /// </summary>
        /// <returns></returns>
        public IActionResult Add()
        {
            return View("Add");
        }
    }
}

访问报错:

http://localhost:55742/issues/add.html

 

错误。

处理您的请求时发生错误。

请求 ID: 00-fa080328ab53cc43a320a58124899fe4-842fd398a465bf40-00

请求路径: /issues/add.html

异常信息: The request matched multiple endpoints. Matches: YESCMS.Controllers.IssuesController.List (YESCMS) YESCMS.Controllers.IssuesController.Add (YESCMS)

堆栈跟踪: at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ReportAmbiguity(CandidateState[] candidateState) at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ProcessFinalCandidates(HttpContext httpContext, CandidateState[] candidateState) at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.Select(HttpContext httpContext, CandidateState[] candidateState) at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.SelectAsync(HttpContext httpContext, CandidateSet candidateSet) at Microsoft.AspNetCore.Routing.Matching.DfaMatcher.SelectEndpointWithPoliciesAsync(HttpContext httpContext, IEndpointSelectorPolicy[] policies, CandidateSet candidateSet) at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.<Invoke>g__AwaitMatch|8_1(EndpointRoutingMiddleware middleware, HttpContext httpContext, Task matchTask) at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context) at YESCMS.Startup.<>c__DisplayClass5_0.<<Configure>b__5>d.MoveNext() in E:\GZ\GZBlog\YESCMS\Startup.cs:line 146 --- End of stack trace from previous location --- at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

内部异常:

参考:

.net core3.1路由配置伪链接该怎么配置_已解决_博问_博客园 (cnblogs.com)

 

解决方案

利用动态路由DynamicRouteValueTransformer

C# 全选
public class YEDefaultRouteValueTransformer : DynamicRouteValueTransformer
{
	public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
	{
		return await Task.Run(() =>
		{
			return values;
		});
	}
}

路由配置:

C# 全选
//endpoints.MapControllerRoute(
//    name: "default_page",
//    pattern: "{controller}/{action}.html");

//endpoints.MapControllerRoute(
//    name: "default_page",
//    pattern: "{controller}/{action}/page.html");

endpoints.MapDynamicControllerRoute<YEDefaultRouteValueTransformer>("/{controller}/{action}.html");

// 约束action只能是list,只有list才支持分页,不约束的话 [controller]/add/1.html 也能匹配进来,但是page这个参数是无效参数
endpoints.MapDynamicControllerRoute<YEDefaultRouteValueTransformer>("/{controller}/{action:regex(^list$)}/{page}.html");

路由约束参考: .NET Core中的路由约束

也可以拆分 YEDefaultRouteValueTransformer 为两个类

需要在 Startup.csConfigureServices(IServiceCollection services) 中注册组件

C# 全选
services.AddSingleton<YEDefaultRouteValueTransformer>();
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:javascript删除html字符串中的空行
下一篇:ASP.NET Core MVC中的路由约束
评论列表

发表评论

评论内容
昵称:
关联文章

asp.net core MVC添加.html静态url时报
ASP.NET Core MVC中的约束
ASP.NET Core MVC 在过滤器ActionFilter中保存页面的生成的html静态页面文件
ASP.NET MVCASP.NET Core MVC中获取当前URL/Controller/Action
ASP.NET MVC快速入门(一)
asp.net - 在 ASP.NET Core MVC 中嵌套 TagHelper
配置
ASP.NET+MVC入门踩坑笔记 (一) 创建项目 项目配置运行 以及简单的Api搭建
asp.net TagHelper根据条件向元素添加class
ASP.NET Core官网教程,资料查找
跳转以及参数处理
.NET5 ASP.NET Core 添加API限流
YESWEB 开发框架 配置文件 作用原理
asp.net core mvc修改cshtml试图热加载动态更新
.NET Core MVC中间件使用记录日志
VS调试运行ASP.NET MVC项目,上传静态资源图片404问题,Debug路径
ASP.NET Core web API中使用Swagger/OpenAPI(Swashbuckle)
C# ASP.NET Core开发学生信息管理系统(二)
vue 跳转的几种方式(带参数)
ASP.NET MVC使用@Url.Action 多个参数中间&被URL编码了

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码