我的Razor视图中的奇怪自动命名空间导入

时间:2012-12-07 08:01:52

标签: asp.net-mvc razor

今天我注意到了,例如虽然我没有主动导入它们,但我的所有剃刀视图中都导入了“System”和“System.Web.Security”。我查了一下:

  • @using directive
  • web.config(编辑:也是全球web.config)
  • AddGlobalImport

编辑:

似乎这些命名空间导入在Razor源代码中是硬连线的

https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.WebPages.Razor/WebPageRazorHost.cs

    private WebPageRazorHost()
    {
        NamespaceImports.Add("System");
        NamespaceImports.Add("System.Collections.Generic");
        NamespaceImports.Add("System.IO");
        NamespaceImports.Add("System.Linq");
        NamespaceImports.Add("System.Net");
        NamespaceImports.Add("System.Web");
        NamespaceImports.Add("System.Web.Helpers");
        NamespaceImports.Add("System.Web.Security");
        NamespaceImports.Add("System.Web.UI");
        NamespaceImports.Add("System.Web.WebPages");
        NamespaceImports.Add("System.Web.WebPages.Html");

        // ...
    }

似乎我无法通过在web.config开头设置“clear”来禁用它们:

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage" >
        <namespaces>
            <clear />
            <add namespace="System.Web.Helpers" />
            <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" />
        </namespaces>
    </pages>
</system.web.webPages.razor>

因此,除非更改Razor源,否则此问题可能无法修复。

3 个答案:

答案 0 :(得分:2)

这很常见,因为它在以下位置的整个Web配置文件中注册:

systemroot\Microsoft.NET\Framework\versionNumber\CONFIG\Web.config  

它是这样注册的:

 <pages>
            <namespaces>
                <add namespace="System" />
                <add namespace="System.Collections" />
                <add namespace="System.Collections.Generic" />
                <add namespace="System.Collections.Specialized" />
                <add namespace="System.ComponentModel.DataAnnotations" />
                <add namespace="System.Configuration" />
                <add namespace="System.Linq" />
                <add namespace="System.Text" />
                <add namespace="System.Text.RegularExpressions" />
                <add namespace="System.Web" />
                <add namespace="System.Web.Caching" />
                <add namespace="System.Web.DynamicData" />
                <add namespace="System.Web.SessionState" />
                <add namespace="System.Web.Security" />
                <add namespace="System.Web.Profile" />                    
                <add namespace="System.Xml.Linq" />
            </namespaces>  
 </pages>

修改

以下内容来自SO回答here

在预览1中,Razor使用了WebForms命名空间配置部分。但是在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>

答案 1 :(得分:1)

我在回答另一个问题时遇到了这个问题(Removing System.Web.UI from a Razor view)。以下是我的答案的副本。它可能很有用。

我不确定这是不是你所追求的,但我做了一个快速的实验。我认为它有效。

我稍微扩展了MvcWebRazorHostFactory。新工厂基本上传递基类创建的主机,但首先删除命名空间。

这是班级:

namespace TestCode
{
    using System.Web.WebPages.Razor;
    using System.Web.Mvc;
    using System.Web.Mvc.Razor;

    public class CustomWebRazorHostFactory : MvcWebRazorHostFactory
    {
        public override WebPageRazorHost CreateHost(string virtualPath, string physicalPath)
        {
            WebPageRazorHost host = base.CreateHost(virtualPath, physicalPath);
            host.NamespaceImports.Remove("System.Web.UI");
            return host;
        }
    }
}

然后我改变了web.config以使用我的工厂而不是标准工厂:

<system.web.webPages.razor>
    <!--<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />-->
    <host factoryType="TestCode.CustomWebRazorHostFactory" />

宾果!

答案 2 :(得分:0)

所以答案是:在Razor视图中,总是导入一些名称空间。这在配置中无法禁用,因为它在代码中是硬连线的。这些名称空间是:

  • 系统
  • System.Collections.Generic
  • System.IO
  • System.Linq的
  • System.Net
  • 的System.Web
  • System.Web.Helpers
  • System.Web.Security
  • 的System.Web.UI
  • System.Web.WebPages
  • System.Web.WebPages.Html

我并非100%确定这是完整的答案,但只要没有反对意见,我就会接受。