ASP.Net Core razor 页面处理程序成为包罗万象的路线
Posted
技术标签:
【中文标题】ASP.Net Core razor 页面处理程序成为包罗万象的路线【英文标题】:ASP.Net Core razor page handler becomes a catch-all route 【发布时间】:2020-05-31 02:39:08 【问题描述】:我有一个简单的 ASP.Net Core 3.1 Razor Pages 项目。在 Index.cshtml 中,我已将 @page 更改为 @page "handler?",因此我可以使用基于路由的处理程序方法。这很好用。问题是,现在这个页面变成了任何 url 的包罗万象的路由。例如,我可以去http://mysite/foo,它不会再给出 404。如果处理程序方法不存在,如何使其返回 404?
【问题讨论】:
【参考方案1】:我不知道这是否是最好的解决方案:
public class IsValidPageHandler : ActionMethodSelectorAttribute
public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
if (!routeContext.RouteData.Values.ContainsKey("handler")
|| routeContext.RouteData.Values["handler"] == null
|| ((CompiledPageActionDescriptor) action).HandlerMethods.Any(f=>routeContext.RouteData.Values["handler"].ToString().Equals(f.Name, StringComparison.OrdinalIgnoreCase)))
return true;
else
return false;
然后
...
endpoints.MapRazorPages();
var actions = app.ApplicationServices.GetService<IActionDescriptorCollectionProvider>();
foreach (var item in actions.ActionDescriptors.Items.Where(f => f.AttributeRouteInfo != null && f.AttributeRouteInfo.Template.Contains("handler?")).ToList())
item.ActionConstraints.Add(new IsValidPageHandler());
...
其他解决方案创建一个过滤器并添加过滤器,但稍后会在管道中发生。在你有 context.HandlerMethod 和 RouteData 的上下文,你可以比较类似于上面的内容
public class CustomRazorPageFilter : IAsyncPageFilter
public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
...
...
【讨论】:
以上是关于ASP.Net Core razor 页面处理程序成为包罗万象的路线的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 ASP.NET Core 2.1 中捕获对 Razor 页面不存在的自定义处理程序的 HTTP 请求?
示例 AJAX 回调到 ASP.NET Core Razor 页面
ASP.NET Core 2,使用没有 MVC 的 Razor 页面单击按钮