gpt4 book ai didi

asp.net-mvc-3 - 自定义 WebPageRazorHostFactory

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

就像我可以设置 DefaultControllerFactory到我自己的 global.asax调用 ControllerBuilder.Current.SetControllerFactory()并提供工厂的自定义实现,是否有可能以某种方式为应用程序提供我自己的 WebPageRazorHostFactory 实现? ?

我想要实现的是将 View 封装在 IoC 容器中以提供依赖注入(inject)。我在 Haacked 上阅读了以下文章:http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx我认为这可能会增加该解决方案。

以下似乎不起作用并引发错误:

Unable to cast object of type 'ASP._Page_Views__ViewStart_cshtml' to type 'System.Web.WebPages.StartPage



Global.asax:(C# 项目)
    protected void Application_Init()
{
System.Web.WebPages.Razor.RazorBuildProvider.RegisterBuildProvider("cshtml", typeof(DefaultRazorBuildProvider));
}

类定义:(VB 项目)
Public Class DefaultRazorBuildProvider : Inherits System.Web.WebPages.Razor.RazorBuildProvider
Private Shared _factories As New ConcurrentDictionary(Of String, Func(Of IKernel, DefaultWebPageRazorHostFactory))(StringComparer.OrdinalIgnoreCase)
Private Shared _kernel As IKernel

Friend Shared TypeFactory As Func(Of String, Type) = AddressOf DefaultTypeFactory

Public Shared Function GetKernel() As IKernel
If _kernel Is Nothing Then Throw New NullReferenceException("_kernel is not set")

Return _kernel
End Function

Public Shared Sub SetKernel(ByVal kernel As IKernel)
_kernel = kernel
End Sub

Public Shared Function CreateHostFromConfig(ByVal virtualPath As String) As WebPageRazorHost
Return CreateHostFromConfig(virtualPath, Nothing)
End Function

Public Shared Function CreateHostFromConfig(ByVal virtualPath As String, ByVal physicalPath As String) As WebPageRazorHost
If [String].IsNullOrEmpty(virtualPath) Then
Throw New ArgumentNullException("virtualPath")
End If

Return CreateHostFromConfigCore(GetRazorSection(virtualPath), virtualPath, physicalPath)
End Function

Public Shared Function CreateHostFromConfig(ByVal config As RazorWebSectionGroup, ByVal virtualPath As String) As WebPageRazorHost
Return CreateHostFromConfig(config, virtualPath, Nothing)
End Function

Public Shared Function CreateHostFromConfig(ByVal config As RazorWebSectionGroup, ByVal virtualPath As String, ByVal physicalPath As String) As WebPageRazorHost
If config Is Nothing Then
Throw New ArgumentNullException("config")
End If
If [String].IsNullOrEmpty(virtualPath) Then
Throw New ArgumentNullException("virtualPath")
End If

Return CreateHostFromConfigCore(config, virtualPath, physicalPath)
End Function

Friend Shared Function CreateHostFromConfigCore(ByVal config As RazorWebSectionGroup, ByVal virtualPath As String) As WebPageRazorHost
Return CreateHostFromConfigCore(config, virtualPath, Nothing)
End Function




Private Shared Function CreateFactory(ByVal typeName As String) As Func(Of IKernel, DefaultWebPageRazorHostFactory)
Dim factoryType As Type = TypeFactory(typeName)
If factoryType Is Nothing Then
Throw New InvalidOperationException("Factory type not valid")
End If



Dim param = Expression.Parameter(GetType(IKernel))

Dim body = Expression.[New](factoryType.GetConstructor(New Type() {GetType(IKernel)}), param)
Return Expression.Lambda(Of Func(Of IKernel, DefaultWebPageRazorHostFactory))(body, param).Compile()
End Function



Public Shared Sub ApplyConfigurationToHost(ByVal config As RazorPagesSection, ByVal host As WebPageRazorHost)
host.DefaultPageBaseClass = config.PageBaseType

For Each import As String In config.Namespaces.OfType(Of NamespaceInfo)().[Select](Function(ns) ns.[Namespace])
host.NamespaceImports.Add(import)
Next
End Sub


Friend Shared Function CreateHostFromConfigCore(ByVal config As RazorWebSectionGroup, ByVal virtualPath As String, ByVal physicalPath As String) As WebPageRazorHost

virtualPath = EnsureAppRelative(virtualPath)

If virtualPath.StartsWith("~/App_Code", StringComparison.OrdinalIgnoreCase) Then
Return New WebCodeRazorHost(virtualPath, physicalPath)
End If

Dim factory As DefaultWebPageRazorHostFactory = Nothing
If config IsNot Nothing AndAlso config.Host IsNot Nothing AndAlso Not [String].IsNullOrEmpty(config.Host.FactoryType) Then
Dim factoryCreator As Func(Of IKernel, DefaultWebPageRazorHostFactory) = _factories.GetOrAdd(config.Host.FactoryType, CreateFactory(config.Type))
Debug.Assert(factoryCreator IsNot Nothing)
factory = factoryCreator(_kernel)
End If

Dim host As WebPageRazorHost = (If(factory, New DefaultWebPageRazorHostFactory(_kernel))).CreateHost(virtualPath, physicalPath)

If config IsNot Nothing AndAlso config.Pages IsNot Nothing Then
ApplyConfigurationToHost(config.Pages, host)
End If

Return host
End Function

Friend Shared Function GetRazorSection(ByVal virtualPath As String) As RazorWebSectionGroup
Return New RazorWebSectionGroup() With { _
.Host = DirectCast(WebConfigurationManager.GetSection(HostSection.SectionName, virtualPath), HostSection), _
.Pages = DirectCast(WebConfigurationManager.GetSection(RazorPagesSection.SectionName, virtualPath), RazorPagesSection) _
}
End Function

Private Shared Function EnsureAppRelative(ByVal virtualPath As String) As String
If HostingEnvironment.IsHosted Then
virtualPath = VirtualPathUtility.ToAppRelative(virtualPath)
Else
If virtualPath.StartsWith("/", StringComparison.Ordinal) Then
virtualPath = "~" & virtualPath
ElseIf Not virtualPath.StartsWith("~/", StringComparison.Ordinal) Then
virtualPath = "~/" & virtualPath
End If
End If
Return virtualPath
End Function

Private Shared Function DefaultTypeFactory(ByVal typeName As String) As Type
Return BuildManager.[GetType](typeName, False, False)
End Function
End Class

Public Class DefaultWebPageRazorHostFactory : Inherits System.Web.WebPages.Razor.WebRazorHostFactory
Private _kernel As IKernel

Public Sub New()
Me._kernel = Nothing
End Sub

Public Sub New(ByVal kernel As IKernel)
Me._kernel = kernel
End Sub

Public Overrides Function CreateHost(ByVal virtualPath As String, ByVal physicalPath As String) As System.Web.WebPages.Razor.WebPageRazorHost
Return New DefaultWebPageRazorHost(Me._kernel, virtualPath, physicalPath)
End Function
End Class

Public Class DefaultWebPageRazorHost : Inherits System.Web.WebPages.Razor.WebPageRazorHost
Private _kernel As IKernel

Sub New(ByVal kernel As IKernel, ByVal virtualPath As String, ByVal physicalPath As String)
MyBase.New(virtualPath, physicalPath)
Me._kernel = kernel
End Sub
End Class

最佳答案

Yes ;在 Web.config 中:

<system.web.webPages.razor>
<host factoryType="MyProject.MyWebPageRazorHost" />
<pages pageBaseType="MyProject.CustomWebPage">
<namespaces>
<add namespace="MyProject.SomeNamespace" />
</namespaces>
</pages>
</system.web.webPages.razor>

编辑

用代码创建主机,可以继承 RazorBuildProvider并覆盖 CreateHost方法,然后注册您继承的 CSHTML 和 VBHTML 版本。
在您的覆盖中,您需要返回 WebCodeRazorHost对于 App_Code 内的页面.

你应该下载 the source code ;这将有很大帮助。
查看 mvc3-rtm-sources\webpages\src\System.Web.WebPages.Razor .

关于asp.net-mvc-3 - 自定义 WebPageRazorHostFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5119305/

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