Asp.net JS/CSS包括节替换、调试和发布

Asp.net JS/CSS包括节替换、调试和发布,asp.net,javascript,msbuild,compression,Asp.net,Javascript,Msbuild,Compression,我很想听听人们是如何处理条件标记的,特别是在发布版和调试版之间的母版页中 这适用于处理连接的js和css文件的特定场景。我目前正在使用YUI compress的.Net端口从大量单独的文件集合中生成一个site.css和site.js 我想到的一个想法是将js和css include部分放在用户控件或面板集合中,并根据程序集的调试或发布状态有条件地显示和标记。大致如下: #if DEBUG pnlDebugIncludes.visible = true #else pnlRele

我很想听听人们是如何处理条件标记的,特别是在发布版和调试版之间的母版页中

这适用于处理连接的js和css文件的特定场景。我目前正在使用YUI compress的.Net端口从大量单独的文件集合中生成一个site.css和site.js

我想到的一个想法是将js和css include部分放在用户控件或面板集合中,并根据程序集的调试或发布状态有条件地显示
标记。大致如下:

#if DEBUG
    pnlDebugIncludes.visible = true
#else
    pnlReleaseIncludes.visible = true       
#endif
面板在语义上不是很好-在
中包装
标记有点恶心;必须有更好的办法。我还认为像
中的
这样的块级元素是无效的html


另一个想法是,可以使用web.config节替换来处理此问题,但我不确定如何进行此操作。

我刚刚在ASP.NET MVC项目的母版页中尝试了此方法,效果良好。如果在调试模式下,我使用jQuery的开发版本,如果不在调试模式下,我使用jQuery的简化版本:

<head runat="server">
<% #if DEBUG %>
    <script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery.js") %>"></script>
<% #else %>
    <script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery.min.js") %>"></script>
<% #endif %>
</head>

这里有一个关于web.config设置更改的不错的讨论:

注意:你问的是一个不同的问题,但我还是建议你看看这个问题,因为这是一个关于如何在实时设置和调试设置之间切换的非常棒的建议集合,所有答案(IMO)都有一定的价值,而不仅仅是投票率最高/接受率最高的答案

就我个人而言,我使用此处介绍的方法,认为它最灵活,适用于所有类型的配置更改,因为它基于文件,但允许根据解决方案配置自动交换:

基本上,您运行一个预构建事件,将web配置与磁盘上的另一个配置交换,并将解决方案配置名称附加到文件名中。例如,我有web.config.release、web.config.debug,甚至还有一个web.config.neilathome

然后,通过创建分部类并将在解决方案配置之间更改的内容放在它们自己的文件中,我对条件位代码使用完全相同的方法。例如,我有sync_timersettings.cs,它是一个部分类,包含一些常量,用于定义更新代码调用web服务的频率。或者你可以把你的所有设置放在app.settings文件中,这样做

我发现它是一个非常灵活的解决方案,它允许我交换javascript和css的块,只要您花时间将不同配置之间发生的更改放在自己的文件中,您可能会进入一种状态,在调试解决方案配置中进行调试,然后在单击一次后切换到发布和部署

另请注意:

#if DEBUG
    pnlDebugIncludes.visible = true
#else
    pnlReleaseIncludes.visible = true       
#endif
评论回复:

只有当您有调试解决方案配置和另一个实时部署时,这才有用。当您(像我一样)拥有登台、发布和neilonhislaptop解决方案配置时,它将不起作用,因为调试符号仅在您启用调试时设置。解决方法是转到web应用程序的“属性”页,在“构建”选项卡中,为每个构建配置添加一个条件符号。即,将构建配置设置为release,并将“release”放在该选项卡的条件符号框中。然后对不同的生成配置执行相同操作,其中的条件符号框将根据您的生成配置自动更改#如果条件编译指令将按预期工作,那么

Bayard询问了更多关于如何使用此选项在配置之间更改标记的信息。好的,您可以使用来交换整个.aspx页面-have home.aspx.release和home.aspx.debug,但这意味着您必须在每个文件中重复大量标记。我的解决方案是向我的应用程序中添加一个分部类。例如,我的“ViewImage”页面中有以下类定义:

public partial class ViewImage : System.Web.UI.Page
…因此,我创建了一些具有相同签名的类文件,并将它们命名为“ViewImage_titleset.cs.debug”和“ViewImage_titleset.cs.staging”:

namespace Website
{
    public partial class ViewImage : System.Web.UI.Page
    {
        public void SetTitle()
        {
            Page.Title = "Running in debug mode";
        }
    }
}

..在ViewImage的页面加载事件中调用SetTitle将根据所处的构建配置更改标题。只有在以编程方式更改页面时,这才有效


最好使用上面的条件编译方法来更改这样的代码,并保留文件交换方法来更改非代码文件,如images或web.configs。请确保您没有设置要在发布时部署的替代文件。

关于JS文件,我所做的是用于预编译web应用程序。构建完成后,如果配置已发布,那么我将缩小JS文件并替换输出目录中的文件。这一切都是通过完成的,因为Web部署项目是MSBuild文件

我还使用开发、测试和生产解决方案配置。只要为每个配置定义一个条件编译符号,您就应该能够这样做:#如果开发pnlDevelopmentIncludes.visible=true#endif#如果测试pnltestinincludes.visible=true#endifNeil这显然是正确的方法。请详细说明如何使用分部类在不同版本之间更改标记。您可能希望将命名约定更改为更像web.debub.config或web.release.config。默认情况下,IIS将不提供以.config结尾的文件,因此最好是.Praveen,这在一开始对我来说似乎很明显,但解决方案配置无法使用条件语句检测,因为它们没有设置符号。您可以编辑web应用程序的属性并添加
namespace Website
{
    public partial class ViewImage : System.Web.UI.Page
    {
        public void SetTitle()
        {
            Page.Title = "Running in staging mode";
        }
    }
}