如何获取不带“On”前缀和可选“Async”后缀的 Razor 页面处理程序方法名称?

问题描述 投票:0回答:1

我希望获取 razor 页面处理程序“RAW”方法名称,用于验证我的应用程序中 IAsyncPageFilter 实现的 OnPageHandlerExecutionAsync 中的调用处理程序方法,

context.HandlerMethod.Name = rawMethodName

我客观地要求它支持以强类型方式工作,并确保始终引用正确的处理程序方法。

Razor 页面框架使用命名约定来选择要执行的适当处理程序方法。默认约定的工作原理是将用于请求的 HTTP 方法与方法名称相匹配,方法名称以“On”为前缀,例如

OnGet()
OnPost()
OnPut()
等。处理程序方法也有可选的异步等效项,例如
OnPostAsync()
OnGetAsync()

我尝试了以下方法来使用正则表达式替换匹配约定。

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

用例

然后我在我的

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
属性的名称?请对此方法提供任何建议或合适的解决方法。

c# asp.net-core razor-pages
1个回答
0
投票

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

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();
    }
© www.soinside.com 2019 - 2024. All rights reserved.