我希望获得razor页面处理程序"原始"方法名,用于在我的应用程序中使用context.HandlerMethod.Name = rawMethodName验证IAsyncPageFilter实现的OnPageHandlerExecutionAsync中的调用处理程序方法.

客观上,我需要它来支持在strongly typed manner中工作,并确保始终引用正确的处理程序方法.

The Razor Page Framework use a naming convention以 Select 要执行的适当处理程序方法.默认约定的工作方式是将用于请求的HTTP方法与方法名匹配,方法名以"on"为前缀,例如OnGet()OnPost()OnPut()等.处理程序方法也有可选的异步等效项,例如OnPostAsync()OnGetAsync()等.

我try 了以下方法来替换使用Regex的匹配约定.

public string GetRawHandlerMethodName(string handlerMethod)
{
    List<string> namingConventions = new List<string>() { "OnGet", "OnPost", "OnPut", "Async" };
    string handlerMethodName = handlerMethod;
    foreach (string namingConvention in namingConventions)
    {
        string[] result = Regex.Split(handlerMethodName, namingConvention, RegexOptions.IgnoreCase);
        handlerMethodName = string.Join("", result);
    }
    return handlerMethodName;
}

我以强类型方式调用该方法,如下所示:

string rawMethodName = GetRawHandlerMethodName(nameof(OnPostMyMethodAsync));
// Output: MyMethod

用例

然后,我在my IAsyncPageFilter中使用输出进行验证,如下所示:

public async override Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
    string rawMethodName = GetRawHandlerMethodName(nameof(OnPostMyMethodAsync));
    if (!string.IsNullOrEmpty(context.HandlerMethod.Name) && context.HandlerMethod.Name == rawMethodName)
    {
        // Calling method is MyMethod. Do work...
    }
}

是否有检索处理程序方法名以执行此判断的常规方法?例如,ASP.NET Core如何获取和设置与我们验证所依据的名称类似的context.HandlerMethod.Name属性的名称?请为此方法提供任何建议或适当的解决方法.

推荐答案

我认为您不需要自己映射处理程序,只需比较方法名称,如下所示:

public async override Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context,
                                                           PageHandlerExecutionDelegate next)
    {
        var targetMethod = nameof(OnGet);
        if (context.HandlerMethod?.MethodInfo.Name == targetMethod)
        {
            //do work here
        }
    
        await next.Invoke();
    }

Csharp相关问答推荐

.NET通过版本自动增量设置包版本

有没有方法让ASP.NET Core模型绑定器使用私有设置器来设置属性?

错误NU 1301:无法加载源的服务索引

EF Core判断是否应用了AsSplitQuery()

EF Core在请求列表时忽略列,但在按ID获取时包含

如何删除文件的基础上嵌入的时间戳嵌入文件名

C#XmlSerializer-输出控制新行的多个XML片段

无法创建';';类型的';DbContext';.异常';无法解析类型';Microsoft.EntityFrameworkCore.DbContextOptions`1[Comm的服务

使用Entity Framework6在对象中填充列表会导致列表大多为空

如何向事件添加成员

Polly重试URL复制值

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

如何防止Visual Studio断点以红色突出显示到整行?

异步任务调用程序集

如何让两个.NET版本不兼容的项目对话?

Postgres ENUM类型在第一次运行时对Dapper不可见

错误:此版本的Visual Studio无法打开以下项目

Visual Studio 17.8.0制表符自动完成问题--三缩进

如何在绑定到数据库的datagridview中向上或向下移动行

如何在.NET Core 8中自定义标识用户模型