RazorGenerator не видит настраиваемого помощника cshtml

У меня проблема с 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 в пространстве имен?


person Krzysztof    schedule 11.02.2015    source источник
comment
В сообщении об ошибке указано «ViewHelpers» с буквой S. в конце. Вы уверены, что не писали @ ViewHelpers.test (this.Html)?   -  person Augusto Barreto    schedule 17.02.2015


Ответы (5)


Решение:

Вам нужно поместить этот комментарий в начало хелпера в App_Code:

@*
    Generator: MvcHelper
    GeneratePrettyNames : true
*@

Затем в web.config, где у вас есть конфигурация для страниц Razor, вам нужно добавить пространство имен, которое 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) {

Вам необходимо добавить эти комментарии директивы, чтобы сообщить генератору бритвы о создании класса с «обычным» именем (таким же, как имя вспомогательного файла, вы делаете это с помощью директивы 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 с пространством имен этого сгенерированного помощника.

person Mariusz Pawelski    schedule 04.12.2015
comment
В моем случае мне также пришлось изменить действие сборки сгенерированного вспомогательного файла cs на Compile (для него было установлено значение Content) - person youen; 09.12.2015
comment
@youen, я использую плагин RazorGenerator.MsBuild, а не VS для генерации кода, поэтому у меня не было этой проблемы. :) Я сделал как описано здесь - person Mariusz Pawelski; 09.12.2015

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

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

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

person Sean Clifford    schedule 04.10.2015

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

@* GeneratePrettyNames : true *@
person Alex from Jitbit    schedule 16.02.2015

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

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

person Krzysztof    schedule 26.02.2015

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

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

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

person Brian Surowiec    schedule 08.10.2016
comment
Мне также нужно было добавить RazorVersion: 3, иначе проект не компилировался с первой попытки (как ни странно, он компилировался при последующих попытках) - person MrMister; 01.09.2020