RazorGenerator无法看到自定义的cshtml帮助器
我遇到了RazorGenerator的问题:它无法编译使用我的自定义助手的视图:
App_Code文件/ ViewHelper.cshtml
@helper test(System.Web.Mvc.HtmlHelper html) { Test
}
查看/ Test.cshtml
(...) @ViewHelper.test(this.Html) (...)
当我尝试编译我的项目时,我得到Test.cshtml的这个错误:
“ViewHelpers”这个名称在当前上下文中不存在
我尝试将各种命名空间添加到我的Views / web.config文件中:
但没有成功……
我错过了一些应该包含在这个文件中的命名空间吗? 如果没有,是否还有其他方法可以让RazorGenerator编译视图? 此外,cshtml助手甚至存在于命名空间中吗?
解:
您需要将此注释放在App_Code
中的助手的开头:
@* Generator: MvcHelper GeneratePrettyNames : true *@
然后在web.config
中你有razor页面的配置,你需要添加RazorGenerator为这些帮助器生成的命名空间:
将YourWebAppNamespace
更改为您的默认项目名称空间(可能是您的项目名称):
说明:
RazorGenerator像普通的剃刀视图一样对待你的助手,因此生成的代码如下所示:
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")] [System.Web.WebPages.PageVirtualPathAttribute("~/App_Code/TestHelper.cshtml")] public partial class _App_Code_TestHelper_cshtml : Komplett.Chrome.Web.Features.Shared.BaseView { #line 3 "..\..\App_Code\TestHelper.cshtml" public System.Web.WebPages.HelperResult HelperName(string name) {
你需要添加这些指令注释,告诉razor生成器创建具有“普通”名称的类(与帮助文件名相同,使用GeneratePrettyNames
指令执行此操作)和静态公共函数,以便可以在其他视图中使用(由Generator: MvcHelper
指令)。 使用这些指令注释RazorGenerator生成C#文件,如下所示:
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")] public class TestHelper : System.Web.WebPages.HelperPage { #line 6 "..\..\App_Code\TestHelper.cshtml" public static System.Web.WebPages.HelperResult HelperName(string name) {
您现在只需要将命名空间添加到web.config
因此C#为其他视图生成的代码将使用带有此生成的帮助程序的命名空间的using语句。
查看obj \ CodeGen文件夹中为帮助程序生成的实际cs文件。 它可能是类名称问题,因此将其添加到帮助程序cshtml文件的顶部:
@* GeneratePrettyNames : true *@
事实certificate,我需要编译帮助程序本身才能使其正常工作。
这并没有让我走得太远:RazorGenerator无法“看到”Mvc命名空间引用。 我读过RG与MVC 5.0或更高版本不兼容(或者是它?)。
当我更新到MVC 5时,我遇到了与RazorGenerator相同的问题。
根据对RazorGenerator的codeplex的讨论 ,似乎RazorGenerator.MsBuild包有时会解决使用正确版本的Razor的问题,因此最终会丢失web.config中定义的命名空间。
要强制它使用正确版本的Razor(并希望获取你的命名空间),在包含文本的项目文件夹中创建一个名为razorgenerator.directives
的文件: RazorVersion: 3
我正在使用RazorGenerator.MsBuild
编译我的视图和RazorGenerator.Mvc
来加载它们。 对我来说最简单的App_Code
修复是将以下内容添加到帮助文件的顶部
@* Generator: MvcHelper GeneratePrettyNames: true Namespace: My.Projects.Namespace *@
有了这个,就没有web.config更改或其他任何需要做的事情。