C# 在代码隐藏文件中,哪个文件定义前端和方法之间的关系?

C# 在代码隐藏文件中,哪个文件定义前端和方法之间的关系?,c#,forms,asp.net-core,get,C#,Forms,Asp.net Core,Get,当视图中有表单元素时: create.cshtml 无论什么 我们在代码隐藏文件中有一个模型: create.cshtml.cs 公共类CreateModel:PageModel { //…随便 公共互联网 { } } 表单将调用OnGet()。我知道这是一个标准,大多数框架都遵循它,但这意味着它必须在.NET中的某个地方定义。什么文件定义了这个标准?如果可以,我们可以更改它吗(为了理解)?初始化时,Razor Pages web应用程序会构建一个实例集合,其中描述web应用程序中的Raz

当视图中有表单元素时:
create.cshtml


无论什么
我们在代码隐藏文件中有一个模型:
create.cshtml.cs

公共类CreateModel:PageModel
{
//…随便
公共互联网
{
}
}

表单将调用
OnGet()
。我知道这是一个标准,大多数框架都遵循它,但这意味着它必须在.NET中的某个地方定义。什么文件定义了这个标准?如果可以,我们可以更改它吗(为了理解)?

初始化时,Razor Pages web应用程序会构建一个实例集合,其中描述web应用程序中的Razor页面及其相关处理程序方法

要进一步了解其工作原理,请查看
DefaultPageApplicationModelProvider
PopulateHandlerMethods
方法:

这段代码很好地解释了它自己,但最终它解析出了HTTP方法和可选的处理程序名称

最后,框架创建一个实例来保存提取的信息。有了这些信息,路由系统就能够根据传入的请求选择处理程序。该选择逻辑由类处理

DefaultPageApplicationModelPartsProvider
类实现了
IPageApplicationModelPartsProvider
接口,并使用DI进行解析。您可以创建自己的
IPageApplicationModelPartsProvider实现,并替换默认实现,例如,这将允许您执行自己的方法名解析

要使用自定义实现,例如
MyCustomPageApplicationModelPartsProvider
,最好在调用
AddRazorPages
之前,将以下内容添加到
ConfigureServices

services.AddSingleton<IPageApplicationModelPartsProvider,
    MyCustomPageApplicationModelPartsProvider>();
services.AddSingleton();

除了解释框架如何找到处理程序外,答案还应该解释框架如何将一个文件定义为另一个文件的代码


使用.cshtml文件中的
@model
指令建立页面与其
PageModel
之间的连接。e、 g.在
Index.cshtml
中,您将看到
@model IndexModel
。您可以将
Index.cshtml.cs
重命名为
SomethingElse.cs
,它仍然可以工作,因此文件命名更像是一种约定。

据我所知,它不必是一种形式。页面也可以触发OnGet
。它更像一个事件监听器。如果您查看默认的CRUD页面,您将看到POST请求也可以被该方法截获(当然现在是
OnPost
)。不,我想知道的是,框架在其页面模型类中调用
OnGet
命名方法的配置在哪里?因为
OnGet
是一个完全由用户定义和用户声明的方法。它不是从PageModel类继承的
internal static bool TryParseHandlerMethod(
    string methodName, out string httpMethod, out string handler)
{
    httpMethod = null;
    handler = null;

    // Handler method names always start with "On"
    if (!methodName.StartsWith("On") || methodName.Length <= "On".Length)
    {
        return false;
    }

    // Now we parse the method name according to our conventions to
    // determine the required HTTP method and optional 'handler name'.
    // Valid names look like:
    //  - OnGet
    //  - OnPost
    //  - OnFooBar
    //  - OnTraceAsync
    //  - OnPostEditAsync

    var start = "On".Length;
    var length = methodName.Length;
    if (methodName.EndsWith("Async", StringComparison.Ordinal))
    {
        length -= "Async".Length;
    }

    if (start == length)
    {
        // There are no additional characters. This is "On" or "OnAsync".
        return false;
    }

    // The http method follows "On" and is required to be at least one
    // character. We use casing to determine where it ends.
    var handlerNameStart = start + 1;
    for (; handlerNameStart < length; handlerNameStart++)
    {
        if (char.IsUpper(methodName[handlerNameStart]))
        {
            break;
        }
    }

    httpMethod = methodName.Substring(start, handlerNameStart - start);

    // The handler name follows the http method and is optional.
    // It includes everything up to the end excluding the "Async" suffix
    // (if present).
    handler = handlerNameStart == length
        ? null
        : methodName.Substring(handlerNameStart, length - handlerNameStart);
    return true;
}
services.AddSingleton<IPageApplicationModelPartsProvider,
    MyCustomPageApplicationModelPartsProvider>();