如何在Razor页面上添加额外的命名空间而不是@using声明?


146

我需要使用某种魔术来获取pages/namespaceswebconfig元素中的名称空间吗?

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

以上只是想要的工作。我知道名称空间很好,因为当我将放在@using MyCustomHelpers页面顶部时,它可以神奇地工作。

这样一来,我Html.SomeFunction()无需将@using所有页面放在顶部就可以开始工作


1
您正在使用哪个版本的MVC 3?
2010年

我使用的是MVC 3 Preview,因此即使升级后,其他答案对我也仍然有效...但是您的答案似乎更适合新版本-我很快将升级到该版本。不好意思我不能接受两个答案。
MyNameIsJob 2010年

从答案中的注释尚不清楚,但是在MVC4中,需要将名称空间添加到\ Views文件夹中的Web.Config文件中,而不是应用程序Web.Config中。在<system.web.webPages.razor>配置部分应该已经存在于该Web.Config中!
Ben McIntyre

Answers:


163

更新:请查看适用于MVC 3 RC的更新后的答案:找不到Razor HtmlHelper扩展(或其他用于视图的命名空间)

在MVC 3 Preview 1和MVC 3 Beta(仅在今天发布)之间已经发生了变化。在Preview 1中,Razor使用了WebForms名称空间config部分。但是,在Beta中,有一个新的配置部分与WebForms分开。您将需要将以下内容添加到您的web.config文件中(或仅从模板开始一个全新的项目):

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

请注意,您可能需要关闭并重新打开文件,以使编辑器可以获取更改。

请注意,要使Razor在MVC3 Beta中运行,web.config中还需要进行其他更改,因此最好查看~\View\Web.configBeta项目模板中随附的文件。


2
FWIW,我发现该pageBaseType="System.Web.Mvc.WebViewPage"属性也是必需的。我已更新您的答案。
波特曼2010年

1
这与您为MVC 3 RC所做的方式相同吗?
克拉克

1
+1谢谢。我今天花了太多时间试图找到这个问题的答案。
jessegavin 2010年

32
您很可能需要关闭.cshtml文件,如果该文件无法正常工作或出现错误
Simon_Weaver 2010年

1
@Simon是的,您需要更新重新打开文件。现在的编辑器不在监视web.config的更改。
marcind 2010年

50

如果将名称空间声明放在Web.config根目录“ Views”文件夹中和/或当前区域的“ Views”文件夹中(取决于您的视图所在位置)-它应该可以正常工作。


6

我发现了这个http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx,其中介绍了如何向所有剃刀页面添加自定义命名空间。

基本上你可以做到这一点

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

并将以下代码放入您的AssemblyInfo.cs中

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

方法InitializeApplication将在global.asax中的Application_Start之前执行


方法已移至System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport(“ Fully.Qualified.Namespace”);
2017年

4

对于它的价值,另一种技术是简单地将您的帮助程序扩展类放入默认情况下视图引擎已包含的System命名空间中。例如:

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

这样,只要引用了包含该类的库,所有内容都将看到它。由于您正在扩展System.Web.Mvc类,因此将扩展方法放在相同的名称空间中似乎是可以接受的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.