Razor HtmlHelper Extensions (u otros espacios de nombres para vistas) No encontrado

167

No sé si esto estaba sucediendo en PR o Beta, pero si creo un método de extensión HtmlHelper, no se reconoce en una página con Razor:

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

Lo agregué a la <Namespaces>sección en Web.config:

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

Pero arroja un error de compilación al intentar ver la página:

@Html.Foo()

Si vuelvo a crear la página con WebForms , funciona bien. ¿Cual es el trato?

Solución alterna

Si lo incluyo @using SomeNamespace.Extensionsen mi vista Razor, entonces funciona, pero prefiero tenerlo enWeb.config

swilliams
fuente
2
Incluso la solución no funciona para mí. El método de extensión se mostrará en intelliSense, pero arroja un error de compilación durante el tiempo de ejecución.
Clark
+1 para la solución alternativa @using. Lo prefiero en mi caso.
Kent
La solución alternativa @using está bien para una sola vista. Pero para múltiples vistas, la gestión del código se convierte en un problema.
Rahatur

Respuestas:

274

Desde la Beta, Razor usa una sección de configuración diferente para definir globalmente las importaciones de espacios de nombres. En su Views\Web.configarchivo debe agregar lo siguiente:

<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 la herramienta de actualización MVC 3 para asegurarse automáticamente de que tiene los valores de configuración correctos.

Tenga en cuenta que es posible que deba cerrar y volver a abrir el archivo para que el editor recoja los cambios.

marcind
fuente
1
¿Me estoy perdiendo una referencia de ensamblaje? No reconoce System.Web.Mvc.WebViewPage ni ninguno de los tipos en la sección configSections.
Clark
44
Tuve que agregar una referencia a> System.Web.WebPages.Razor y lo resolvió.
TWith2Sugars
44
No está funcionando para mi. Estoy usando MVC 3 RC, agregué mi espacio de nombres a web.config en mi carpeta de vistas. Todavía no puedo ver mis extensiones en la página de Razor. El evento que pone @using <nombre de extensión> no funciona. @ TWith2Sugars Ni siquiera puedo encontrar System.Web.WebPages.Razor para agregar, agregué System.Web.Razor pero no ayudó. Estoy realmente atrapado aquí
freddoo
31
+1 por decirme que abra y cierre el archivo para ver las actualizaciones.
Amir
26
¡Gracias por señalar que esta no es la raíz web.config, sino la web.config en la carpeta Ver!
G-Wiz
11

Como sugiere la respuesta aceptada, puede agregar "usar" a todas las vistas agregando a la sección del archivo de configuración.

Pero para una sola vista, podrías usar

@using SomeNamespace.Extensions

Paul Rowland
fuente
6

Tuve este mismo error en una aplicación MVC 4 usando Razor. En un intento de limpiar los archivos web.config, eliminé los dos webpages:valores de configuración:

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

Una vez que restaure estos valores de configuración, las páginas se compilarían correctamente y los errores relacionados con el .Partial()método de extensión desaparecieron.

John Rasch
fuente
5

Tuve este problema en VS 2015. Lo siguiente lo resolvió por mí:

Busque "páginas web: Versión" en la configuración de la aplicación y actualícela a la versión 3.0.0.0. Mi web.config tenía

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

y lo actualicé a

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

Descubrí que poner esta sección en mi web.config para cada carpeta de vista lo resolvió.

<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
fuente
1
De hecho, descubrí que por alguna razón el ROOT web.config tenía una redirección vinculante que estaba causando mi problema (específicamente, apuntando 0.0.0.0-2.0.0.0a 1.0.0.0), y el /View/web.configarchivo no anula eso. (Además, no creo que lo necesites en todos /View/Subfolder/)
JoeBrockhaus
1

Este error le dice que no tiene el motor de afeitar asociado correctamente con su proyecto.

Solución: en la ventana Explorador de soluciones, haga clic con el botón derecho en su proyecto web y seleccione "Administrar paquetes Nuget ..." y luego instale "Microsoft ASP.NET Razor". Esto asegurará que el paquete esté instalado correctamente y agregará las entradas necesarias en su archivo web.config.

usuario3459730
fuente
-6

Dado que ASP.NET MVC 3 RTM está disponible, no hay necesidad de una sección de configuración para Razor. Y estas secciones se pueden eliminar de forma segura.

nick4eva
fuente
Me pregunto si eso es cierto, nick4eva. Si creo una nueva aplicación web MVC 3 y elijo el motor de visualización Razor, el web.config, que está presente en la carpeta Vistas, tendrá las configuraciones de configuración razor por defecto. Si los desactivo, obtendré errores de compilación en tiempo de ejecución.
MichaelvR
3
MichaelvR, sí, fue mi error. Lamento que hayas entrado en confusión.
nick4eva
¿Esto también cuenta para un proyecto MVC impulsado por VB? No tengo acceso a mis métodos de extensión ... stackoverflow.com/questions/4789273/…
Ropstah
Esta respuesta es incorrecta. Estas entradas de configuración aún son necesarias. Las nuevas plantillas de proyecto ya las tienen, pero si está actualizando una aplicación Mvc 2, tendrá que agregarlas.
marcind