我遇到RazorGenerator问题:它无法编译使用我的自定义助手的视图:
App_Code / ViewHelper.cshtml
@helper test(System.Web.Mvc.HtmlHelper html)
{
<h4>Test</h4>
}
查看/ Test.cshtml
(...)
@ViewHelper.test(this.Html)
(...)
当我尝试编译我的项目时,我得到了Test.cshtml的错误:
名称&#39; ViewHelpers&#39;在当前上下文中不存在
我尝试将各种命名空间添加到我的Views / web.config文件中:
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.Optimization" />
<add namespace="MyProject" />
<add namespace="Kendo.Mvc.UI" />
<add namespace="MvcSiteMapProvider.Web.Html" />
<add namespace="MvcSiteMapProvider.Web.Html.Models" />
</namespaces>
</pages>
</system.web.webPages.razor>
但没有成功......
我是否遗漏了应该包含在此文件中的某些命名空间?如果没有,是否还有其他方法可以让RazorGenerator编译视图?此外,cshtml助手是否甚至存在于命名空间中?
答案 0 :(得分:11)
您需要将此评论放在App_Code
中的帮助程序的开头:
@*
Generator: MvcHelper
GeneratePrettyNames : true
*@
然后在你有razor页面配置的web.config
中,你需要添加RazorGenerator为这些帮助者生成的命名空间:
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="YourWebAppNamespace.App_Code" />
</namespaces>
</pages>
</system.web.webPages.razor>
将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<dynamic>
{
#line 3 "..\..\App_Code\TestHelper.cshtml"
public System.Web.WebPages.HelperResult HelperName(string name) {
您需要添加这些指令注释,以告知razor生成器使用&#34; normal&#34;创建类。 name(与帮助文件名相同,使用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#为其他视图生成的代码将使用带有此生成帮助程序命名空间的语句。
答案 1 :(得分:0)
查看obj \ CodeGen文件夹中为帮助程序生成的实际cs文件。它可能是类名称问题,因此请将其添加到帮助程序cshtml文件的顶部:
@* GeneratePrettyNames : true *@
答案 2 :(得分:0)
事实证明,我需要编译帮助程序本身才能使其正常工作。
但这并没有让我走得太远:RazorGenerator无法看到&#34;&#34; Mvc命名空间引用。我读过RG与MVC 5.0或更高版本不兼容(或者是吗?)。
答案 3 :(得分:0)
当我更新到MVC 5时,我遇到了与RazorGenerator相同的问题。
根据this discussion on RazorGenerator's codeplex,似乎RazorGenerator.MsBuild包有时在解析正确版本的Razor时会出现问题,因此最终错过了web.config中定义的命名空间。
要强制它使用正确版本的Razor(并希望获取您的命名空间),请在包含文本的项目文件夹中创建一个名为razorgenerator.directives
的文件:RazorVersion: 3
答案 4 :(得分:0)
我正在使用RazorGenerator.MsBuild
来编译我的观点,并使用RazorGenerator.Mvc
来加载它们。对我来说最简单的App_Code
修复是将以下内容添加到帮助文件的顶部
@*
Generator: MvcHelper
GeneratePrettyNames: true
Namespace: My.Projects.Namespace
*@
有了这个,就没有web.config的更改或其他任何需要做的事情。