Extensões HtmlHelper do Razor (ou outros namespaces para exibições) Não encontrado

167

Não sei se isso estava acontecendo no PR ou no Beta, mas se eu criar um método de extensão ativado HtmlHelper, ele não será reconhecido em uma página do Razor:

namespace SomeNamespace.Extensions {
    public static class HtmlExtensions {
        public static string Foo(this HtmlHelper html) {
            return "Foo";
        }
    }
}

Adicionei-o à <Namespaces>seção em Web.config:

<pages>
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <!-- snip -->
    <add namespace="SomeNamespace.Extensions"/>
  </namespaces>
</pages>

Mas gera um erro de compilação ao tentar visualizar a página:

@Html.Foo()

Se eu recriar a página com WebForms, ela funcionará bem. Qual é o problema?

Gambiarra

Se eu incluir @using SomeNamespace.Extensionsno meu modo de exibição Razor, ele funcionará, mas eu preferiria apenas tê-loWeb.config

Swilliams
fonte
2
Até a solução alternativa não funciona para mim. O método de extensão será exibido no intelliSense, mas gera um erro de compilação durante o tempo de execução.
Clark
+1 para a solução alternativa @using. Eu prefiro no meu caso.
Kent
@ usar a solução alternativa é aceitável para uma única visualização. Mas, para várias visualizações, o gerenciamento de código se torna um problema.
Rahatur

Respostas:

274

Desde o Beta, o Razor usa uma seção de configuração diferente para a importação global de namespace. No seu Views\Web.configarquivo, você deve adicionar o seguinte:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.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" />
      <!-- Your namespace here -->
    </namespaces>
  </pages>
</system.web.webPages.razor>

Use a ferramenta de atualização do MVC 3 para garantir automaticamente que você tenha os valores de configuração corretos.

Observe que pode ser necessário fechar e reabrir o arquivo para que as alterações sejam selecionadas pelo editor.

marcind
fonte
1
Estou faltando uma referência de montagem? Ele não reconhece System.Web.Mvc.WebViewPage ou qualquer um dos tipos na seção configSections.
Clark
4
Eu tive que adicionar uma referência a> System.Web.WebPages.Razor e ele resolveu.
TWith2Sugars
4
Não está funcionando para mim. Estou usando o MVC 3 RC, adicionei meu namespace ao web.config na minha pasta views. Ainda não consigo ver minhas extensões na página Razor. Evento colocando @using <extensionname> não funciona. @ TWith2Sugars Nem consigo encontrar System.Web.WebPages.Razor para adicionar, adicionei System.Web.Razor, mas não ajudou. Estou realmente preso aqui
freddoo
31
+1 por me dizer para abrir e fechar o arquivo para ver as atualizações.
Amir
26
Obrigado por apontar que este não é o web.config raiz, mas o web.config na pasta View!
G-Wiz
11

Como a resposta aceita sugere, você pode adicionar "using" a todas as visualizações adicionando à seção do arquivo de configuração.

Mas, para uma visão única, você pode simplesmente usar

@using SomeNamespace.Extensions

Paul Rowland
fonte
6

Eu tive esse mesmo erro em um aplicativo MVC 4 usando o Razor. Na tentativa de limpar os arquivos web.config, removi os dois webpages:valores de configuração:

<appSettings>
  <add key="webpages:Version" value="2.0.0.0" />
  <add key="webpages:Enabled" value="false" />

Depois de restaurar esses valores de configuração, as páginas seriam compiladas corretamente e os erros relacionados ao .Partial()método de extensão desapareciam.

John Rasch
fonte
5

Eu tive esse problema no VS 2015. O seguinte foi resolvido para mim:

Encontre "páginas da web: versão" nas configurações de aplicativos e atualize-o para a versão 3.0.0.0. Meu web.config tinha

<add key="webpages:Version" value="2.0.0.0" />

e eu atualizei para

<add key="webpages:Version" value="3.0.0.0" />
Damian Green
fonte
3

Eu descobri que colocar esta seção no meu web.config para cada pasta de exibição o resolveu.

<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
Joseph Morgan
fonte
1
Na verdade, descobri que, por algum motivo, o ROOT web.config tinha um redirecionamento de ligação que estava causando o meu problema (especificamente, apontando 0.0.0.0-2.0.0.0para 1.0.0.0), e o /View/web.configarquivo não substitui isso. (Além disso, eu não acredito que você precisar dele em cada /View/Subfolder/)
JoeBrockhaus
1

Este erro informa que você não possui o mecanismo de barbear adequadamente associado ao seu projeto.

Solução: Na janela Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto da web e selecione "Gerenciar Pacotes de Nuget ..." e instale "Microsoft ASP.NET Razor". Isso garantirá que o pacote corretamente esteja instalado e adicionará as entradas necessárias ao seu arquivo web.config.

user3459730
fonte
-6

Como o ASP.NET MVC 3 RTM está disponível, não há necessidade da seção de configuração do Razor. E essas seções podem ser removidas com segurança.

nick4eva
fonte
Gostaria de saber se isso é verdade, nick4eva. Se eu criar um novo aplicativo da Web MVC 3 e escolher o mecanismo de exibição Razor, o web.config, presente na pasta Views, terá as configurações do razor por padrão. Se eu desabilitá-los, receberei erros de compilação em tempo de execução.
precisa saber é o seguinte
3
MichaelvR, sim, foi meu erro. Sinto muito que você tenha entrado em confusão.
nick4eva
Isso também conta para um projeto MVC alimentado por VB? Não tenho acesso aos meus métodos de extensão ... stackoverflow.com/questions/4789273/…
Ropstah
Esta resposta está errada. Essas entradas de configuração ainda são necessárias. Os novos modelos de projeto já os possuem, mas se você estiver atualizando um aplicativo Mvc 2, precisará adicioná-los.
marcind 27/02