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


Answers:


852

终于找到答案了。

@using MyNamespace

对于VB.Net:

@Imports Mynamespace

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


4
另外:它们不能进入代码块。(您会遇到运行时错误)
Dan Esparza

5
另外,您不需要分号。
RPM1984 2011年

5
这只是不好的练习期。请不要将此添加到剃须刀页面的顶部。这太乱了。。。正确的方法是添加到视图-web.config中,就像@Javad_Amiry指出的那样。
汤姆·斯蒂克

21
这不是坏习惯。这是绝对必要的功能。web.config就像一个全局using语句,它使名称空间在所有页面中都处于活动状态。如果在不同的命名空间中具有相同名称的类,则可能不是您想要的。如果尝试在同一文件中使用它们,仍然会有冲突,但是可以在一个文件中轻松解决。如果将其粘贴在web.config中,则使用任何一个类的所有页面都将发生冲突。因此,称这种不良做法完全没有道理。
Triynko

4
我感到惊讶的是,Intellisense并未暗示以与普通C#页面中相同的方式添加using语句。
Triynko

397

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

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提醒他有关领域!他说:

如果您在某个区域内工作,则必须namespaceWeb.config下方添加/Areas/<AreaName>/Views/而不是 /Views/


10
@vtortola:哪个web.config?Views文件夹中的web.config文件,而不是根文件夹中的主web.config文件。好?
ravy amiry 2011年

9
我希望希望能节省一些人的时间,说如果您在某个区域内工作,则必须在/ Areas / <AreaName> Views /下的Web.config中添加名称空间,而不是/视图/。
尼克·席尔伯斯坦

11
@MatthijsWessels不,它不需要重新启动VS。只需构建项目,它就会生效。至少我总是这样做。如果打开了一个视图,则必须在构建之前关闭该视图,并在构建之后将其重新打开。
ravy amiry

2
@Javad_Amiry,啊哈,我确实重建过,但是没有关闭视图。
Matthijs Wessels,2012年

1
是的,这是正确的方法。不是像在OP中那样在Razor页面顶部使用using语句选择答案....
Tom Stickel 2015年

30

对于图书馆

@using MyNamespace

对于模型

@model MyModel

1
为什么没有; 在最后?
FrenkyB

2
@FrenkyB,因为这不是C#代码,而是Razor代码。将using在cs文件的开头是一个C#编译器的关键字。将@using在.cshtml文件的开头是一个暗示,剃刀模板引擎。
标记

27

在ASP.NET MVC 3 Preview1中,可以使用Global.asax.cs中的此代码在所有剃刀视图上导入名称空间

Microsoft.WebPages.Compilation.CodeGeneratorSettings.AddGlobalImport("Namespace.Namespace");

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


6
RTM中将有一个web.config部分,但我们也想提供一个API来执行此操作,因为许多用户开始远离config。因此,我们为您提供两种选择!
安德鲁·斯坦顿·纳瑟

6
从ASP.NET MVC 3 Beta开始,此方法不再起作用。有一个新的web.config部分,如此处stackoverflow.com/questions/3875207/…所述。导入一个全局命名空间各方意见的AddGlobalImport方法已被转移到这个类System.Web.WebPages.Razor.WebPagesRazorHost
赫尔曼

16

我发现了这个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之前执行


4
这实际上是一个很好的答案,但是的位置Microsoft.WebPages.Compilation.AddGlobalImport已更改为System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport
jahu 2014年

2
使用此方法的最大优势来自以下事实:名称空间将在所有视图(包括区域内的视图)中使用,而仅在一个位置进行声明。
jahu 2014年

14

一个问题是你必须知道的是,当您导入通过命名空间web.configViews的文件夹,即namespace进口JUST了意见,在文件夹中。表示如果要namespace区域视图中导入,还必须将该导入namespace到区域web.config文件Views夹中该区域的文件中;


11

对于命名空间和库

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


3

“使用MyNamespace”在MVC3 RTM中有效。希望这可以帮助。


2

我认为为了在剃刀视图中导入名称空间,您只需要添加以下方式:

@using XX.YY.ZZ

0

根据您的需要,可以使用以下方法之一:

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.