gpt4 book ai didi

c# - 哪个文件定义了代码隐藏文件中前端和方法之间的关系?

转载 作者:行者123 更新时间:2023-12-03 18:57:17 25 4
gpt4 key购买 nike

当我在 View 中有一个表单元素时:create.cshtml

<form method="get">
...whatever
</form>
我们在代码隐藏文件中有一个模型: create.cshtml.cs
public class CreateModel : PageModel 
{
//...whatever
public void OnGet()
{

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

最佳答案

初始化后,Razor Pages Web 应用程序会构建 PageApplicationModel 的集合实例,这些实例描述了 Web 应用程序中的 Razor 页面及其关联的处理程序方法。
要了解有关其工作原理的更多信息,请查看 source对于DefaultPageApplicationModelProviderPopulateHandlerMethods方法:

internal void PopulateHandlerMethods(PageApplicationModel pageModel)
{
var methods = pageModel.HandlerType.GetMethods();

for (var i = 0; i < methods.Length; i++)
{
var handler = _pageApplicationModelPartsProvider
.CreateHandlerModel(methods[i]);

if (handler != null)
{
pageModel.HandlerMethods.Add(handler);
}
}
}

在这里,我们可以看到框架枚举了 Razor Page 的类的方法并调用了 DefaultPageApplicationModelPartsProvider CreateHandlerModel 这些方法中的每一个。 CreateHandlerModel确定方法是否为处理程序(例如,它是 public,而不是 static),然后解析方法名称以确定其 HTTP 方法、处理程序名称等。此解析发生在 TryParseHandlerMethod :
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;
}

这段代码很好地解释了自己,但最终它解析出 HTTP 方法和一个可选的处理程序名称。
最后,框架创建 PageHandlerModel 的实例。保存提取的信息。有了这些信息,路由系统就能够根据传入的请求选择处理程序。此选择逻辑由 DefaultPageHandlerMethodSelector 处理。类(class)。 DefaultPageApplicationModelPartsProvider类实现 IPageApplicationModelPartsProvider接口(interface)并使用 DI 解决。您可以创建自己的 IPageApplicationModelPartsProvider 实现并替换默认实现,例如,这将允许您执行自己的方法名称解析。
要使用自定义实现,例如 MyCustomPageApplicationModelPartsProvider , 添加如下内容到 ConfigureServices ,最好是在调用 AddRazorPages 之前:
services.AddSingleton<IPageApplicationModelPartsProvider,
MyCustomPageApplicationModelPartsProvider>();

In addition to explaining how the framework finds the handlers, the answer also should explain how does the framework define one file as a code-behind for another.


页面与其 PageModel 之间的联系使用 @model 制作.cshtml 文件中的指令。例如在 Index.cshtml你会看到 @model IndexModel .您可以重命名 Index.cshtml.csSomethingElse.cs它仍然可以工作,因此文件命名更像是一种约定。

关于c# - 哪个文件定义了代码隐藏文件中前端和方法之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65626065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com