Como adicionar namespaces extras às páginas do Razor em vez de usar a declaração?

146

Existe algum tipo de mágica que eu preciso usar para obter os espaços para nome no pages/namespaceselemento no webconfig?

<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>

O item acima simplesmente não quer funcionar. Eu sei que o espaço para nome é bom porque, quando coloco @using MyCustomHelperso topo da página, ele funciona magicamente.

Isso é para que eu possa Html.SomeFunction()trabalhar sem precisar colocar @usingno topo de todas as minhas páginas

MyNameIsJob
fonte
1
qual versão do MVC 3 você está usando?
marcind
Eu estava usando o MVC 3 Preview, então a outra resposta funcionou para mim e ainda funciona, mesmo após a atualização ... no entanto, sua resposta parece mais apropriada para a nova versão - para a qual atualizarei em breve. Pena que não posso aceitar duas respostas.
MyNameIsJob
Não está claro nos comentários nas respostas, mas no MVC4, o espaço para nome precisa ser adicionado ao arquivo Web.Config na pasta \ Views, NÃO no aplicativo Web.Config. A <system.web.webPages.razor>seção de configuração já deve existir no THAT Web.Config!
Ben McIntyre

Respostas:

163

Atualização : dê uma olhada na minha resposta atualizada que se aplica ao MVC 3 RC: Razor HtmlHelper Extensions (ou outros namespaces para visualizações)

Isso mudou entre o MVC 3 Preview 1 e o MVC 3 Beta (lançado hoje mesmo). Na pré-visualização 1, o Razor usou a seção de configuração dos espaços para nome do WebForms. No entanto, na versão beta, há uma nova seção de configuração separada da WebForms. Você precisará adicionar o seguinte ao seu arquivo web.config (ou apenas começar com um novo projeto do modelo):

<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>

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

Observe que há outras alterações no que é necessário no web.config para que o Razor funcione no MVC3 Beta; portanto, é melhor dar uma olhada no ~\View\Web.configarquivo enviado nos modelos de projeto Beta.

marcind
fonte
2
FWIW, eu descobri que o pageBaseType="System.Web.Mvc.WebViewPage"atributo também é necessário. Atualizei sua resposta.
Portman
1
É assim que você faria no MVC 3 RC?
Clark
1
+1 OBRIGADO. Passei muito tempo tentando encontrar a resposta para esse problema hoje.
Jessegavin #
32
você provavelmente precisará fechar e reabrir o arquivo .cshtml se ele não estiver funcionando ou
estiver
1
@ Simon sim, você precisa atualizar reabrir o arquivo. O editor no momento não está observando alterações no web.config.
marcind
50

Se você colocar sua declaração de namespace na Web.configpasta raiz "Views" e / ou na pasta "Views" da área atual (dependendo da localização da sua visualização) - ela deverá funcionar conforme o esperado.

Buildstarted
fonte
6

Encontrei este http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx, que explica como adicionar um espaço para nome personalizado a todas as suas páginas de barbear.

Basicamente, você pode fazer isso

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

e coloque o seguinte código no seu AssemblyInfo.cs

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

o método InitializeApplication será executado antes do Application_Start em global.asax

k-dev
fonte
Método movido para System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
Agrath
4

Para o que vale, outra técnica é simplesmente colocar sua classe de extensão auxiliar em um espaço para nome do sistema que já está incluído no mecanismo de exibição por padrão. Por exemplo:

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

Dessa forma, desde que a biblioteca que contém a classe seja referenciada, tudo o verá. Como você está estendendo uma System.Web.Mvcclasse, parece razoavelmente aceitável colocar os métodos de extensão no mesmo espaço para nome.

Peter
fonte