假设我有一个ASP.NET Core7MVC项目,其中同时支持页面和视图.如果一个页面和一个视图指向同一个终结点,哪一个会优先?为什么?因此,为了进一步扩展,我有一个Razor类库,它包含一个Pages >> Account >> Login.cshtml的Razor页面(和代码隐藏文件Login.cshtml.cs).

这是为了充当"默认"登录行为.同时,我在AccountController内设置了一个控制器操作,以查看是否可以覆盖该页面.但页面似乎总是排在首位.

以下是我的代码:

Program.cs

builder.Services.AddMvc();
builder.Services.AddRazorPages().AddRazorRuntimeCompilation();

// ...

app.MapControllerRoute(name: "area-default", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");

// I incorrectly assumed that by placing this after the controller routes, the MVC routes would take precedence
app.MapRazorPages();

AccountController.cs

using Microsoft.AspNetCore.Mvc;

namespace RazorClassLibrary.Controllers
{
    public class AccountController : Controller
    {
        [HttpGet]
        public IActionResult Login()
        {
            return Content("This is an override from the RCL.");
        }
    }
}

当我注释掉第app.MapRazorPages()行时,MVC路由就会如期生效.但是,如果这条线存在,则页面总是胜过控制器操作.

我的目标是让控制器操作覆盖页面.这个是可能的吗?有什么 idea 吗?

推荐答案

位于请求流水线中间的URL匹配器构建状态机来解析每个传入请求,并与每个端点的URL模式进行匹配.

在存在歧义且多条路由可能匹配相同URL的情况下,使用以下precedence rules对路由进行排序;

  • 一百零二,一百.您可以通过在任何端点.MapX规则之后调用.WithOrder(int)来显式设置.或者是attributes [Route(Order=X)]号公路上的.
  • 路径段的数量,最长的在前.Eg a/b/c将匹配超过a/b
  • 然后按顺序排列分段;/Literals/{parameters-with-constraints}、[/{parameters}/complex-{segments}]
  • 遵守所有规则(如/{**slug})
  • 如果是平局,可能会抛出AmbiguousMatchException分,导致500分错误.

请注意,没有提到控制器和页面之间的默认顺序.尽管控制器路由通常与[controller]路由变量相匹配,而每个页面将具有显式路径.从而导致页面被优先 Select .

Csharp相关问答推荐

将实例绑定方法传递到列表foreach

AutoMapper -如何为两个不同的用例设置单个映射?

哪个nuget包含SecurityStampValidatorOptions

如何循环遍历XML文档 node 以使用XSLT存储值

将XPS转换为PDF C#

Azure Function应用(. NET 8)不将信息记录到应用洞察

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

Blazorise折线图仅绘制数据集的一部分

附加标题不起作用,而添加则起作用

单行上的ReSharper数据标注

有没有类似于扩展元素的合并元组的语法?

如何管理Azure认证客户端响应和证书 fingerprint

在C#中有没有办法减少大型数组中新字符串的分配?

Content WithTargetPath实际上是有效的MSBuild项吗?

MSI无法将快捷方式添加到启动文件夹

如何使用Npgsql从SELECT获得所有查询结果

基于C#方法的EF核心过滤查询(缓冲与流)

无法向Unity注册Microsoft Logger

反编译源代码时出现奇怪的字符

默认架构不存在EF核心迁移