我正在创建一个 ASP.NET Core 5 Razor Pages 应用程序,我想添加一个页面来显示当前登录用户的所有可访问页面(其 URL)。每个用户都有不同级别的授权权限,因此我会检查
[Authorization]
属性及其 Policy
属性。另一方面,管理员用户可以访问所有页面,因此它应该看到应用程序中可用的所有网址/页面。
到目前为止,我能够使用反射来获取所有
PageModel
类及其 [Authorization]
属性,但现在我想知道是否有办法获取每个 PageModel
的 url?请注意,我是在应用程序运行时执行所有这些操作,因此当我执行此操作时,路由基础设施应该启动并运行。
您可以像您提到的那样使用反射:
在您的
example.cshtml.cs
文件中,执行如下操作:
public class ExampleModel(ILogger<ExampleModel> logger, IEnumerable<EndpointDataSource> endpointSources)
: PageModel
{
public IEnumerable<RouteEndpoint> EndpointSources { get; set; } = Enumerable.Empty<RouteEndpoint>();
public void OnGet()
{
EndpointSources = endpointSources
.SelectMany(es => es.Endpoints)
.OfType<RouteEndpoint>).Where(x=>x.Metadata.Any(v=>v.GetType().FullName.Contains("Authorization")));
}
}
在
example.cshtml
中,您可以循环浏览结果:
@foreach (var item in Model.EndpointSources.OrderBy(x=>x.RoutePattern.RawText))
{
@item.RoutePattern.RawText<br />
}
这将生成这些页面的 url 列表,例如
/secure
/account
/users