¿Cómo agregar espacios de nombres adicionales a las páginas de Razor en lugar de utilizar la declaración?

146

¿Hay algún tipo de magia que necesito usar para obtener los espacios de nombres en el pages/namespaceselemento en la configuración web?

<pages>
    <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.WebPages"/>
        <add namespace="System.Web.Helpers"/>
        <add namespace="MyCustomHelpers"/>
    </namespaces>
</pages>

Lo anterior simplemente no quiere funcionar. Sé que el espacio de nombres está bien porque cuando pongo el @using MyCustomHelpersen la parte superior de la página funciona mágicamente.

Esto es para que pueda Html.SomeFunction()trabajar sin tener que poner @usingen la parte superior de todas mis páginas

MyNameIsJob
fuente
1
¿Qué versión de MVC 3 estás usando?
Marcind
Estaba usando MVC 3 Preview, por lo que la otra respuesta funcionó para mí y aún funciona, incluso después de la actualización ... sin embargo, su respuesta parece más apropiada para la nueva versión, que actualizaré en breve. Es una pena que no pueda aceptar dos respuestas.
MyNameIsJob
Los comentarios en las respuestas no lo aclaran, pero en MVC4, el espacio de nombres debe agregarse al archivo Web.Config en la carpeta \ Views, NO a la aplicación Web.Config. La <system.web.webPages.razor>sección de configuración ya debería existir en ESE Web.Config!
Ben McIntyre

Respuestas:

163

Actualización : consulte mi respuesta actualizada que se aplica a MVC 3 RC: Extensiones Razor HtmlHelper (u otros espacios de nombres para las vistas) No encontrado

Esto ha cambiado entre MVC 3 Preview 1 y MVC 3 Beta (lanzado hoy). En Vista previa 1, Razor utilizó la sección de configuración de espacios de nombres de WebForms. Sin embargo, en la Beta hay una nueva sección de configuración que está separada de la de WebForms. Deberá agregar lo siguiente a su archivo web.config (o simplemente comenzar con un nuevo proyecto desde la plantilla):

<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>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="MyCustomHelpers" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

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

Tenga en cuenta que hay otros cambios en lo que se requiere en web.config para que Razor funcione en MVC3 Beta, por lo que sería mejor que eche un vistazo al ~\View\Web.configarchivo que se incluye en las plantillas de proyecto Beta.

marcind
fuente
2
FWIW, he encontrado que el pageBaseType="System.Web.Mvc.WebViewPage"atributo también es obligatorio. He actualizado tu respuesta.
Portman
1
¿Es de la misma manera que lo harías para MVC 3 RC?
Clark
1
+1 GRACIAS Hoy pasé demasiado tiempo tratando de encontrar la respuesta a este problema.
jessegavin el
32
lo más probable es que necesite cerrar y volver a abrir el archivo .cshtml si no funciona o si se
produce
1
@ Simon sí, necesita actualizar, vuelva a abrir el archivo. El editor en este momento no está atento a los cambios de web.config.
marcind
50

Si coloca su declaración de espacio de nombres en la Web.configcarpeta raíz "Vistas" y / o en la carpeta "Vistas" del área actual (dependiendo de dónde esté su vista), debería funcionar como se esperaba.

Comenzó
fuente
6

Encontré este http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx que explica cómo agregar un espacio de nombres personalizado a todas sus páginas de afeitar.

Básicamente puedes hacer esto

using Microsoft.WebPages.Compilation;
public class PreApplicationStart
{
   public static void InitializeApplication()
   {
       CodeGeneratorSettings.AddGlobalImport("Custom.Namespace");
   }
}

y ponga el siguiente código en su AssemblyInfo.cs

[assembly: PreApplicationStartMethod(typeof(PreApplicationStart), "InitializeApplication")]

el método InitializeApplication se ejecutará antes de Application_Start en global.asax

k-dev
fuente
El método se movió a System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
agrath
4

Para lo que vale, otra técnica es simplemente colocar su clase de extensión auxiliar en un espacio de nombres del sistema que ya está incluido en el motor de vista de forma predeterminada. Por ejemplo:

namespace System.Web.Mvc
{
    public static class HtmlHelper_MyExtensions
    {
        ...
    }
}

De esta manera, siempre que se haga referencia a la biblioteca que contiene la clase, todo lo verá. Como está extendiendo una System.Web.Mvcclase, parece razonablemente aceptable colocar los métodos de extensión en el mismo espacio de nombres.

Peter
fuente