ASP.NET MVC: web.config 中是否有访问项目条件编译符号的语法

ASP.NET MVC: Is there a syntax to access a project conditional compile symbol in web.config

ASP.NET MVC:在web.config中是否有访问项目条件编译符号的语法?

例如我可以在每个区域使用不同的数据库,或者确定是否需要 HTTPS 等。

2012年的一个类似问题似乎对此并不看好: ASP.NET - Conditional Web.config

.config 文件不是构建的一部分,因此我不确定您希望通过在那里设置配置转换无法完成的条件来实现什么。 XML 是标记 - 它本身不包含任何 行为 。为此,您需要某种转换引擎。

<system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
        In the example below, the "Replace" transform will replace the entire 
        <customErrors> section of your web.config file.
        Note that because there is only one customErrors section under the 
        <system.web> node, there is no need to use the "xdt:Locator" attribute.

    <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
    </customErrors>
-->
    <sessionState xdt:Transform="Remove"/>
    <trace xdt:Transform="Remove"/>
</system.web>

但是,MSBuild 支持条件。这意味着您可以通过手动编辑将条件放入 .csproj(或 .vbproj)文件中。有关详细信息,请参阅

<ItemGroup Condition=" $(DefineConstants.Contains('MVC2')) ">
    <Reference Include="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
</ItemGroup>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC3')) ">
    <!-- Due to the windows update MS14-059, we need this hack to ensure we can build MVC3 both on machines that have the update and those that don't -->
    <Reference Condition=" Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Condition=" !Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Razor.1.0.20105.408\lib\net40\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
</ItemGroup>

在上面的例子中,如果条件编译字段包含MVC2则包含第一组引用,如果包含MVC3则包含第二组引用。请注意,符号以分号分隔。

<DefineConstants>MVC2;NET35;</DefineConstants>