HtmlHelper 的“ViewContext.Controller”发生了什么?

Jez*_*Jez 8 c# asp.net html-helper .net-core asp.net-core

在我的旧 ASP.NET Web 应用程序中,我编写了一个 HTML 帮助程序,以通过访问以下内容来访问执行当前视图的控制器的上下文ViewContext.Controller

public static string GetControllerString(this HtmlHelper htmlHelper) {
    string controllerString = htmlHelper.ViewContext.Controller.ToString();
    return ".NET Controller: " + controllerString;
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不再存在于 ASP.NET Core 的 HTML 帮助器对象中:

public static string GetControllerString(this IHtmlHelper htmlHelper) {
    string controllerString = htmlHelper.ViewContext.Controller.ToString(); // Doesn't exist!
    return ".NET Core Controller: " + controllerString;
}
Run Code Online (Sandbox Code Playgroud)

发生什么事了ViewContext.Controller?现在是否无法从 HTML 帮助器对象获取控制器上下文?

Dar*_*dan 5

他们稍微改变了继承链和术语。因此,在 ASPNET Core 中并不像在旧的 ASPNET MVC框架ViewContext中那样继承。ControllerContext

相反,ViewContext 继承ActionContext是更通用的术语。

因此,对象Controller上没有继承的属性ViewContext,但您可以使用ActionDescriptor property来获取所需的值。

public static string GetControllerString(this IHtmlHelper htmlHelper) {
    string actionDescriptor = htmlHelper.ViewContext.ActionDescriptor.DisplayName;
    return ".NET Core Controller: " + actionDescriptorName;
}
Run Code Online (Sandbox Code Playgroud)

  • 作为补充说明,“ActionDescriptor”可以是“ControllerActionDescriptor”(用于渲染 MVC 视图的经典控制器样式),也可以是“PageActionDescriptor”(用于构建页面的新的所谓“Razor 页面”方法)。它们具有完全不同的属性。 (2认同)