3

今天我注意到,例如“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 源,否则此问题可能无法修复。

4

3 回答 3

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 答案:

在 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>
于 2012-12-07T08:17:39.657 回答
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" />

答对了!

于 2013-08-15T02:30:50.090 回答
0

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

  • 系统
  • System.Collections.Generic
  • 系统.IO
  • System.Linq
  • 系统网
  • 系统.Web
  • System.Web.Helpers
  • 系统.Web.安全
  • 系统.Web.UI
  • System.Web.WebPages
  • System.Web.WebPages.Html

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

于 2012-12-10T16:18:41.240 回答