18

我在使用 RazorGenerator 时遇到问题:它无法编译使用我的自定义助手的视图:

App_Code/ViewHelper.cshtml

@helper test(System.Web.Mvc.HtmlHelper html)
{
    <h4>Test</h4>    
}

视图/Test.cshtml

(...)
@ViewHelper.test(this.Html)
(...)

当我尝试编译我的项目时,我收到 Test.cshtml 的此错误:

当前上下文中不存在名称“ViewHelpers”

我尝试将各种命名空间添加到我的 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 助手是否存在于命名空间中?

4

5 回答 5

12

解决方案:

您需要将此评论放在您拥有的助手的开头App_Code

@*
    Generator: MvcHelper
    GeneratePrettyNames : true
*@

然后在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为您的默认项目名称空间(可能是您的项目名称):

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 生成器创建具有“正常”名称的类(与帮助文件名相同,您使用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 语句。

于 2015-12-04T15:08:51.673 回答
1

当我更新到 MVC 5 时,我在使用 RazorGenerator 时遇到了同样的问题。

根据关于 RazorGenerator 的 codeplex 的讨论,似乎 RazorGenerator.MsBuild 包有时会在解析要使用的正确版本的 Razor 时出现问题,因此最终会丢失 web.config 中定义的命名空间。

要强制它使用正确版本的 Razor(并希望选择您的命名空间),请在项目文件夹中创建一个名为razorgenerator.directives的文件,其中包含以下文本:RazorVersion: 3

于 2015-10-04T22:49:26.177 回答
0

查看在 obj\CodeGen 文件夹中为帮助程序生成的实际 cs 文件。这可能是类名问题,因此将其添加到帮助程序 cshtml 文件的顶部:

@* GeneratePrettyNames : true *@
于 2015-02-16T21:37:55.937 回答
0

事实证明,我需要编译帮助器本身以使其工作。

但这并没有让我走得太远:RazorGenerator 无法“看到” Mvc 命名空间引用。我读过 RG 与 MVC 5.0 或更高版本不兼容(或者是吗?)。

于 2015-02-26T10:46:26.697 回答
0

RazorGenerator.MsBuild用来编译我的视图并RazorGenerator.Mvc加载它们。对我来说最简单的App_Code解决方法是将以下内容添加到我的帮助文件的顶部

@*
Generator: MvcHelper
GeneratePrettyNames: true
Namespace: My.Projects.Namespace
*@

有了这个,就没有 web.config 更改或其他任何需要进行的操作。

于 2016-10-08T23:15:55.837 回答