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

Krz*_*tof 16 c# model-view-controller razorgenerator

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

App_Code文件/ ViewHelper.cshtml

@helper test(System.Web.Mvc.HtmlHelper html)
{
    <h4>Test</h4>    
}
Run Code Online (Sandbox Code Playgroud)

查看/ Test.cshtml

(...)
@ViewHelper.test(this.Html)
(...)
Run Code Online (Sandbox Code Playgroud)

当我尝试编译我的项目时,我得到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>
Run Code Online (Sandbox Code Playgroud)

但没有成功......

我错过了一些应包含在此文件中的命名空间吗?如果没有,是否还有其他方法可以让RazorGenerator编译视图?此外,cshtml助手甚至存在于命名空间中吗?

Mar*_*ski 12

解:

您需要将此注释放在您所在的助手的开头App_Code:

@*
    Generator: MvcHelper
    GeneratePrettyNames : true
*@
Run Code Online (Sandbox Code Playgroud)

然后在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>
Run Code Online (Sandbox Code Playgroud)

更改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) {
Run Code Online (Sandbox Code Playgroud)

你需要添加这些指令注释来告诉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) {
Run Code Online (Sandbox Code Playgroud)

您现在只需要添加名称空间,web.config以便其他视图的C#生成的代码将使用带有此生成的帮助程序的命名空间的语句.

  • 在我的情况下,我还必须将生成的帮助程序cs文件的"构建操作"更改为"编译"(它被设置为"内容") (3认同)