RazorGenerator无法看到自定义的cshtml帮助器

时间:2015-02-11 23:02:55

标签: c# model-view-controller razorgenerator

我遇到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助手是否甚至存在于命名空间中?

5 个答案:

答案 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更改为您的默认项目名称空间(它可能是您的项目名称):

Default namespace for project in Visual Studio

说明:

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的更改或其他任何需要做的事情。