【问题标题】:How to use code file that inherits `Custom.Dnn.Code12` within `Custom.Dnn.Razor12` file?如何在 `Custom.Dnn.Razor12` 文件中使用继承 `Custom.Dnn.Code12` 的代码文件?
【发布时间】:2022-10-05 03:59:44
【问题描述】:

我想在 2sxc 模块中使用新版本的剃须刀页面编写自定义视图。我的视图“_MyView.cshtml”继承Custom.Dnn.Razor12。所以我创建了一个以@inherits Custom.Dnn.Code12 开头的文件“_MyView.code.cshtml”(也尝试过@inherits ToSic.Sxc.Dnn.RazorComponent,但没有帮助)。

所以当我试图在“_MyView.cshtml”中调用这样的东西时:

@{
    Code.MyMethod();
}

它给了我错误:

错误:System.Web.HttpCompileException (0x80004005):d:\Projects\mywebsite.com.ua\Host\Portals\2\2sxc\MyApp_MyView.cshtml(5):错误 CS0103:名称“代码”不存在于当前上下文在 System.Web.Compilation.AssemblyBuilder.Compile() 在 System.Web.Compilation.BuildProvidersCompiler.PerformBuild() 在 System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) 在 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal (VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert (HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate ) 在 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFo und) 在 System.Web.Compilation.BuildManager.GetCompiledType(VirtualPath virtualPath) at ToSic.Sxc.Engines.RazorEngine.CreateWebPageInstance() 在 C:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn.Razor\ Engines\Razor\RazorEngine.cs:C:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn.Razor\Engines\Razor\RazorEngine 中 ToSic.Sxc.Engines.RazorEngine.InitWebpage() 的第 146 行。 c:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn.Razor\Engines\Razor\RazorEngine.cs:ToSic.Sxc.Engines.RazorEngine.Init() 的第 155 行:ToSic 的第 80 行C:\Projects\2sxc\2sxc\Src\Sxc\ToSic.Sxc\Engines\EngineBase.cs 中的 .Sxc.Engines.EngineBase.Init(IBlock 块):ToSic.Sxc.Blocks.BlockBuilder.GetEngine() 的第 77 行在 C:\Projects\2sxc\2sxc\Src\Sxc\ToSic.Sxc\Blocks\BlockBuilder_Render.cs:C:\Projects\2sxc\2sxc\ 中 ToSic.Sxc.Dnn.Web.DnnClientResources.NeedsPre1025Behavior() 的第 227 行Src\Dnn\ToSic.Sxc.Dnn.Core\Dnn\Web\DnnClientResources.cs:ToSic.Sxc.Dnn.View 的第 95 行。<>c__DisplayClass13_0.<Page_Load>b__1() 在 C:\Projects\2sxc\2sxc \Src\Dnn\ ToSic.Sxc.Dnn\View.ascx.cs:C:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn 中 ToSic.Sxc.Dnn.View.TryCatchAndLogToDnn(Action action, LogCall timerWrap) 的第 82 行\View.ascx.Errors.cs:第 22 行 - 上下文:第 126 页;模块:1724

我知道如果我继续使用旧课程,它现在可能可以工作,但以后可能会停止工作。那么我该如何使用这个呢?

我试图查看 2sxc 文档和 github 代码,但没有找到一个示例。

那么我做错了什么?我该如何使用它?

【问题讨论】:

    标签: dotnetnuke 2sxc


    【解决方案1】:

    Code.xxx 约定是在 v11 前后引入的,因为它看起来是个好主意。这有点像代码和布局的分离。

    https://docs.2sxc.org/net-code/razor/code-behind.html

    基本上这是一种简化,但不是主要的,因为您已经可以执行类似var code = CreateInstance("razorfile.cshtml"); 的操作来获得相同的效果。

    但是当我们进入 v12 并支持 Oqtane(当时是 .net Core 3.0)时,我们意识到这将永远无法在 Oqtane 上运行。对我们来说,保持 API 跨平台一致非常重要,否则文档会变得非常混乱。

    由于它是一个如此小的特性,我们决定不再在较新的基类上支持它。

    因此,如果您确实有共享代码,只需使用something.cs 文件并使用CreateInstance("something.cs")

    对于利用z Razor 功能的模拟代码隐藏,您仍然可以创建_xyz.code.cshtml 并使用CreateInstance(...) 对其进行实例化,但这在Oqtane 中永远不会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多