Combres过滤器未修复相对URL的问题?

3

更新:这里是我认为存在问题的CSS示例:

.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }

更新 - 在Codeplex的Combres问题跟踪器中创建了一个工作项

更新:我查看了日志并找到了问题所在 -

2011-10-24 16:32:20,490 [15] WARN  Combres.Filters.FixUrlsInCssFilter - Cannot fix url url(images/ui-icons_454545_256x240.png)
System.ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length
   at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
   at System.String.Substring(Int32 startIndex, Int32 length)
   at Combres.Filters.FixUrlsInCssFilter.FixUrl(Resource resource, Match match)

那么,我可以获得源代码并查看它吗?还是我需要将它放在combres问题跟踪器上?

我正在使用过滤器 -

 <filter type="Combres.Filters.FixUrlsInCssFilter, Combres" />

这个问题涉及到相对路径的修复,详情请参考这里。但是,url(css背景图片)仍然使用错误的路径,例如:

http://somedomain.com/combres.axd/pics/pic.png

而不是使用

http://somedomain.com/pics/pic.png

我也尝试了显式使用-

<filter type="Combres.Filters.FixUrlsInCssFilter, Combres" acceptedResourceSets="myCss"  />

有人可以给我一些建议吗?我找到了一些类似的内容,但它的解决方案对我不起作用。

更新: 这是我的combres.xml文件,供参考 -

<?xml version="1.0" encoding="utf-8" ?>
<!--
  This file contains basic settings needed for most web apps.
  For full Combres settings (with explanation), refer to the sample definition file: combres_full_with_annotation.xml
  Also, refer to Combres' documentation: http://combres.codeplex.com/documentation  
-->
<combres xmlns='urn:combres'>
  <filters>
    <filter type="Combres.Filters.FixUrlsInCssFilter, Combres" acceptedResourceSets="LogCreateCss"  />
    <filter type="Combres.Filters.DotLessCssFilter, Combres"  acceptedResourceSets="LogCreateCss"  />
  </filters>
  <cssMinifiers>
    <minifier name="yui" type="Combres.Minifiers.YuiCssMinifier, Combres">
      <param name="CssCompressionType" type="string" value="StockYuiCompressor" />
      <param name="ColumnWidth" type="int" value="-1" />
    </minifier>
  </cssMinifiers>
  <jsMinifiers>
    <minifier name="msajax" type="Combres.Minifiers.MSAjaxJSMinifier, Combres" binderType="Combres.Binders.SimpleObjectBinder, Combres">
      <param name="CollapseToLiteral" type="bool" value="true" />
      <param name="EvalsAreSafe" type="bool" value="true" />
      <param name="MacSafariQuirks" type="bool" value="true" />
      <param name="CatchAsLocal" type="bool" value="true" />
      <param name="LocalRenaming" type="string" value="CrunchAll" />
      <param name="OutputMode" type="string" value="SingleLine" />
      <param name="RemoveUnneededCode" type="bool" value="true" />
      <param name="StripDebugStatements" type="bool" value="true" />
    </minifier>
    <minifier name="yui" type="Combres.Minifiers.YuiJSMinifier, Combres">
      <param name="IsVerboseLogging" type="bool" value="false" />
      <param name="IsObfuscateJavascript" type="bool" value="true" />
      <param name="PreserveAllSemicolons" type="bool" value="false" />
      <param name="DisableOptimizations" type="bool" value="true" />
      <param name="LineBreakPosition" type="int" value="-1" />
    </minifier>
  </jsMinifiers>
  <resourceSets url="~/combres.axd" defaultDuration="30"
                                defaultVersion="auto"
                                defaultDebugEnabled="false"
                                defaultJSMinifierRef="msajax"
                                defaultCssMinifierRef="yui">
    <resourceSet name="siteCss" type="css" minifierRef="yui">
      <resource path="\Content\StyleSheets\reset.css" />
      <resource path="\Content\StyleSheets\960.css" />
      <resource path="\Content\StyleSheets\Site960.css" />
      <resource path="\Content\StyleSheets\Site.css" />
    </resourceSet>
    <resourceSet name="siteJs" type="js" minifierRef="msajax">
      <resource path="\Scripts\jquery-1.5.1.min.js" />
      <resource path="\Content\Scripts\blockUI.js"  />
    </resourceSet>
    <resourceSet name="overviewCss" type="css" minifierRef="yui">
      <resource path="\Content\Plugins\fancybox\css\jquery.fancybox-1.3.4.css" />
      <resource path="\Content\StyleSheets\overview_kam.css" />
    </resourceSet>
    <resourceSet name="overviewJs" type="js" minifierRef="msajax">
      <resource path="\Content\Plugins\fancybox\scripts\jquery.fancybox-1.3.4.pack.js" />
    </resourceSet>
    <resourceSet name="LogCreateCss" type="css" minifierRef="yui">
      <resource path="\Content\Plugins\fancybox\css\jquery.fancybox-1.3.4.css" />
    </resourceSet>
    <resourceSet name="activityLogCloseCreateJs" type="js" minifierRef="msajax">
      <resource path="\Content\Plugins\fancybox\scripts\jquery.fancybox-1.3.4.pack.js" />
      <resource path="\Content\Plugins\fancybox\scripts\jquery.fancybox-1.3.4.js" />
    </resourceSet>
    <resourceSet name="LogCreateCss" type="css" minifierRef="yui">
      <resource path="\Content\StyleSheets\Site.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.all.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery-ui.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.accordion.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.autocomplete.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.button.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.core.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.datepicker.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.dialog.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.menu.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.progressbar.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.resizable.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.selectable.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.slider.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.spinner.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.tabs.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.theme.css" />
      <resource path="\Content\Plugins\jquerySpinner\themes\base\jquery.ui.tooltip.css" />
      <resource path="\Content\Plugins\jquerySpinner\demos\demos.css" />
    </resourceSet>
    <resourceSet name="LogCreateJs" type="js" minifierRef="msajax"  >
      <resource path="\Content\Plugins\jquerySpinner\jquery-1.4.3.js" />
      <resource path="\Content\Scripts\ActivityLog\Create.js" />
      <resource path="\Content\Plugins\fancybox\scripts\jquery.fancybox-1.3.4.pack.js" />
      <resource path="\Content\Plugins\jquerySpinner\external\jquery.mousewheel-3.0.4.js" />
      <resource path="\Content\Plugins\jquerySpinner\external\glob.js" />
      <resource path="\Content\Plugins\jquerySpinner\external\glob.de-DE.js" />
      <resource path="\Content\Plugins\jquerySpinner\external\glob.ja-JP.js" />
      <resource path="\Content\Plugins\jquerySpinner\ui\jquery.ui.core.js" />
      <resource path="\Content\Plugins\jquerySpinner\ui\jquery.ui.widget.js" />
      <resource path="\Content\Plugins\jquerySpinner\ui\jquery.ui.button.js" />
      <resource path="\Content\Plugins\jquerySpinner\ui\jquery.ui.spinner.js" />

    </resourceSet>
  </resourceSets>
</combres>

你能否发布CSS文件的部分内容,显示应该被固定的URL? - DanP
@DanP 我已经更新了问题,并附上了CSS的摘录。 - Vishal
1个回答

2
我认为你的CSS中的图像部分格式不正确;请尝试以下代码:
url('images/ui-bg_flat_75_ffffff_40x100.png') /*{bgImgUrlContent}*/

请注意添加单引号和在“)”和注释块之间添加空格

根据经验,我建议使用应用程序根相对语法来保持代码更加清洁,例如,我会将您的代码更改为:

url('~/images/ui-bg_flat_75_ffffff_40x100.png') /*{bgImgUrlContent}*/

更新:

另一种选择是编写自己的ISingleContentFilter实现,该实现更容忍出现在CSS文件中的语法。你可以查看combres的FixUrlsInCssFilter来作为一个很好的起点。

更新:

如果您已经创建了自己改进版本的过滤器,只需将其编译为Web项目的一部分,并在combres.xml中引用它,如下所示:

<filters>
      <filter type="YourProject.MyBetterFilter, YourProject" />
</filters>

没有必要完全重新编译(和维护)一个自定义版本的 Combres 来以这种方式扩展它。


是的...我们正在使用插件和其他附加组件,所以如果这是解决方案,那么我需要在各个地方更改URL。此外,~是一个特定于asp.net的东西,所以我不确定如果将来我们不再使用combres,它是否会起作用。非常感谢您的帮助,让我们看看是否有其他方法可以解决这个问题。 - Vishal
你可以编写自己的ISingleContentFilter实现,以更容忍这种语法。我以前就这样做过,以处理一些特殊情况。 - DanP
所以,我下载了源代码并进行了修改,但我猜想我不能直接在我的项目中使用合并的combres.dll,因为我已经使用NuGet安装了combres,并且它当前使用不同的dll而不是一个。是否有任何方法可以仅用新更改的源代码dll替换combres.dll?如果没有,我只需删除所有先前的引用,然后需要引用合并的combres.dll才能使一切正常工作吗? - Vishal
只需在您的Web项目中编译新过滤器,并在combres.xml文件中相应地引用它,就没有理由仅为此使用自定义版本的combres本身。 - DanP
也许你可以把日志记录从过滤器中移除,这样就不会引用它了?在我的自定义过滤器实现中,我从未使用过combres的日志记录器。 - DanP
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接