Подтвердить что ты не робот

RazorGenerator не видит пользовательский помощник cshtml

У меня проблема с RazorGenerator: он не может компилировать представления, которые используют мой собственный помощник:

App_Code/ViewHelper.cshtml

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

Views/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 в пространстве имен?

4b9b3361

Ответ 1

Решение:

Вам нужно поставить этот комментарий в начале помощника, который у вас есть в 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) {

Вам нужно добавить эти директивные комментарии, чтобы сообщить генератору бритвы, чтобы создать класс с "нормальным" именем (то же, что и имя вспомогательного файла, вы делаете это с директивой GeneratePrettyNames) и статической публичной функцией, чтобы он мог использоваться в другие представления (выполняются директивой Generator: MvcHelper). С этими директивными комментариями RazorGenerator генерирует файл С# следующим образом:

    [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, поэтому сгенерированный код С# для других представлений будет использовать инструкцию с пространством имен этого сгенерированного помощника.

Ответ 2

Посмотрите на фактический cs файл, сгенерированный в папке obj\CodeGen для помощников. Это может быть проблема с именем класса, поэтому добавьте это в верхнюю часть вашего cshtml файла helper:

@* GeneratePrettyNames : true *@

Ответ 3

Оказывается, мне нужно было скомпилировать помощника, чтобы он работал.

Это не помогло мне: RazorGenerator не мог "видеть" ссылки пространства имен Mvc. Я читал, что RG не совместим с MVC версии 5.0 или выше (или это?).

Ответ 4

У меня была такая же проблема с RazorGenerator, когда я обновился до MVC 5.

В соответствии с это обсуждение кода RazorGenerator кажется, что в пакете RazorGenerator.MsBuild иногда возникает проблема с решением правильной версии Razor для использования, поэтому заканчивается отсутствие пространств имен, определенных в файле web.config.

Чтобы заставить его использовать правильную версию Razor (и, надеюсь, забрать ваши пространства имен), создайте файл с именем razorgenerator.directives в папке проекта, содержащей текст: RazorVersion: 3

Ответ 5

Я использую RazorGenerator.MsBuild для компиляции моих просмотров и RazorGenerator.Mvc для их загрузки. Самое легкое исправление App_Code для меня состояло в том, чтобы добавить следующее в мои вспомогательные файлы

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

При этом нет изменений web.config или чего-то еще, что нужно было сделать.