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限流
asp.net core mvc修改cshtml试图热加载动态更新
跳转以及参数处理
YESWEB 开发框架 配置文件 作用原理
.NET Core MVC中间件使用记录日志
VS调试运行ASP.NET MVC项目,上传静态资源图片404问题,Debug路径
ASP.NET Core web API中使用Swagger/OpenAPI(Swashbuckle)
C# ASP.NET Core开发学生信息管理系统(二)
.net core如何添加一个唯一的请求ID
ASP.NET MVC使用@Url.Action 多个参数中间&被URL编码了

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