【问题标题】:Strange automatic namespace imports in my Razor views我的 Razor 视图中奇怪的自动命名空间导入
【发布时间】:2012-11-25 09:33:27
【问题描述】:

今天我注意到了,例如“System”和“System.Web.Security”在我所有的剃须刀视图中都导入了,尽管我没有主动导入它们。我检查了:

  • @using 指令 ​​
  • web.config(编辑:也是全局 web.config)
  • 添加全局导入

编辑:

似乎这些命名空间导入在 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 的开头设置“清除”来禁用这些:

<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 源,否则此问题可能无法修复。

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案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" />
    

    宾果游戏!

    【讨论】:

    • 此解决方案会删除默认导入,但您可以通过键入 long System.IO.File.Delete (X) 来访问它
    【解决方案2】:

    所以答案是:在 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% 确定这是完整的答案,但只要没有反对意见,我就会接受。

    【讨论】:

      【解决方案3】:

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

      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

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

      【讨论】:

      • 谢谢,我想这就是方向。但是对于 Razor,这些设置不在 中,而是在 中,我在整个 web.config 中找不到。
      • 是的,但是这些导入似乎仍然是硬连线的,我无法通过使用此配置部分来摆脱它们。请参阅我的问题的编辑。
      猜你喜欢
      • 2011-03-15
      • 2020-02-18
      • 2010-09-16
      • 1970-01-01
      • 2017-05-10
      • 2012-08-26
      • 1970-01-01
      相关资源
      最近更新 更多