如何在Razor视图页面中导入命名空间?

785

如何在 Razor 视图页面中导入命名空间?


7
您还可以为已导入的命名空间添加别名。https://dev59.com/6W445IYBdhLWcg3wkLFG#8043480 - Surjit Samra
12个回答

897

终于找到答案了。

@using MyNamespace

对于VB.Net:

@Imports Mynamespace

如果您想在整个应用程序中包含命名空间,请查看@ravy amiry的答案


9
也就是说:它们不能放在代码块中(否则会导致运行时错误)。 - Dan Esparza
7
没问题,你不需要分号。 - RPM1984
7
这只是不好的做法。请不要将它添加到你的 Razor 页面的顶部。这样会很混乱等等。正确的方法是像 @Javad_Amiry 指出的那样,将其添加到 Views - web.config 中。 - Tom Stickel
31
这不是坏的实践,而是绝对必要的功能。 web.config 就像一个全局 using 语句,使得命名空间在所有页面中都活跃起来。如果你有不同命名空间中具有相同名称的类,那可能不是你想要的。如果你在同一个文件中使用它们仍然会产生冲突,但你可以轻松地在单个文件中解决这个问题。如果你将其放在 web.config 中,则冲突将在使用这些类的所有页面中出现。因此,称这种做法为坏习惯完全没有意义。 - Triynko
6
我很惊讶Intellisense在普通C#页面中提示添加using语句的方式,在此处没有出现。 - Triynko
显示剩余3条评论

413

第一种方法是在.cshtml文件中使用@using语句,仅将命名空间导入到当前文件中。第二种方法是:

在项目的"Views"目录下的"web.config"文件中(请注意,这不是项目根目录中的主要web.config文件),查找以下部分:

<system.web.webPages.razor>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      <add namespace="System.Web.Mvc.Ajax" />
      .
      .
      <!-- etc -->
    </namespaces>
  </pages>
</system.web.webPages.razor>

您可以像这样添加自定义名称空间:

<add namespace="My.Custom" />

这将为所有的.cshtml(和/或.vbhtml)文件添加命名空间; 此外,你还可以在此更改视图继承方式,例如:

<pages pageBaseType="My.Custom.MyWebViewPage">

敬礼。


更新: 感谢@Nick Silberstein提醒关于区域的事项!他说:

如果您正在工作的区域内,您必须在 /Areas/<AreaName>/Views/下的Web.config中添加命名空间而不是在 /Views/下添加。


12
@vtortola: 是哪个 web.config?是 Views 文件夹里的 web.config 文件,不是主根目录下的 web.config。好吗? - amiry jd
12
希望我能帮助你省下一些时间和烦恼。如果你在一个区域内工作,你必须在Web.config文件的/Areas/<AreaName>Views/部分添加命名空间,而不是在/Views/部分添加。请注意,这不会改变原意。 - Nick Silberstein
13
不需要重新启动VS。只需构建项目即可生效。至少我总是这样做。如果一个视图已经打开,在构建之前必须关闭该视图,然后在构建完成后重新打开它。 - amiry jd
3
@Javad_Amiry,好的,我已经重新构建了,但没有关闭视图。 - Matthijs Wessels
2
是的,这是正确的方法。不是像原帖中所选的答案那样在Razor页面顶部使用Using语句... - Tom Stickel
显示剩余3条评论

34

图书馆

@using MyNamespace

模型

@model MyModel

2
为什么末尾没有分号? - FrenkyB
3
@FrenkyB,因为这不是C#代码,而是Razor代码。在.cs文件开头的“using”是C#编译器关键字。“@using”在.cshtml文件开头是对Razor模板引擎的提示。 - Mark

27
在ASP.NET MVC 3 Preview1中,你可以使用Global.asax.cs中的以下代码在所有Razor视图中导入一个命名空间。
Microsoft.WebPages.Compilation.CodeGeneratorSettings.AddGlobalImport("Namespace.Namespace");

我希望在RTM中,可以通过Web.config部分来完成此操作。


7
在RTM中将会有一个web.config部分,但我们也想提供一个API来完成这个任务,因为许多用户正在逐渐转向使用API而非配置文件。因此我们为你提供两种选择! - Andrew Stanton-Nurse
7
从ASP.NET MVC 3 Beta版本开始,这种方法不再适用。这里有一个新的web.config部分,如此解释:https://dev59.com/KW865IYBdhLWcg3wUs7z。导入全局命名空间到所有视图的AddGlobalImport方法已经移动到System.Web.WebPages.Razor.WebPagesRazorHost类中。 - Germán

16

我发现了这篇文章:http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx,其中详细解释了如何在所有Razor页面中添加自定义命名空间。

基本上,您可以将此代码:

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

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

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

在global.asax中,InitializeApplication方法将在Application_Start方法之前被执行。


5
这实际上是一个相当好的答案,但 Microsoft.WebPages.Compilation.AddGlobalImport 的位置已更改为 System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport - jahu
3
使用这种方法的最大优势在于,命名空间将可在所有视图中使用(包括区域内的视图),同时只需在一个地方声明即可。 - jahu

14

你必须知道的一个问题是,当你通过 web.configViews 文件夹中导入一个命名空间时,该 namespace 仅被导入到该文件夹中的视图中。这意味着如果你想在区域视图中导入一个 namespace,你必须在该区域的 web.config 文件中也导入该 namespace,该文件位于该区域的 Views 文件夹中;


12

对于命名空间和库

@using NameSpace_Name

针对模型

@model Application_Name.Models.Model_Name 

在 Razor 页面中遍历列表(您必须使用 foreach 循环来访问列表项)

@model List<Application_Name.Models.Model_Name>

@foreach (var item in Model)
   {  
          <tr>
                <td>@item.srno</td>
                <td>@item.name</td>
         </tr>  
   }

11

你可以尝试这个

@using MyNamespace

3
我认为在Razor视图中导入命名空间,你只需要按照以下方式添加即可:

我认为在Razor视图中导入命名空间,你只需要按照以下方式添加即可:

@using XX.YY.ZZ

3
"

使用MyNamespace在MVC3 RTM中可行。希望这可以帮到你。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接