2012-07-07 69 views
0

我已經試過squshit和rejuicer試圖結合和縮小一些視圖內的CSS和JS。到目前爲止沒有運氣。我所做的是在過濾我的觀點使用縮小器和捆綁器與城堡下.net 4

$adminRejuicer_css.File("~/Content/css/admin_styles.css").File("~/Content/js/colorpicker/css/jpicker-1.1.6.min.css") 

但沒有把

#region using 
    using System; 
    using Castle.MonoRail.Framework; 
    using campusMap.Models; 
    using MonoRailHelper; 
    using Rejuicer; 
#endregion 

namespace campusMap.Filters 
{ 
    public class scriptFilter : IFilter 
    { 
     public bool Perform(ExecuteWhen exec, IEngineContext context, IController controller, IControllerContext controllerContext) 
     { 
      controllerContext.PropertyBag["adminRejuicer_css"] = OnRequest.ForCss("~/Content/css/min/Combined.css").Compact; 
      controllerContext.PropertyBag["adminRejuicer_js"] = OnRequest.ForJs("~/Content/js/min/Combined.js"); 
      //controllerContext.PropertyBag["JavaScriptBundle"] = new JavaScriptBundle(); 
      return true; 
     } 
    } 
} 

則基本控制器

#region Directives 
    using Castle.MonoRail.Framework; 
    using campusMap.Services; 
    using System.Text.RegularExpressions; 
    using System; 
    using campusMap.Models; 
    using Castle.ActiveRecord; 
    using MonoRailHelper; 
    using campusMap.Filters; 
    using log4net; 
    using log4net.Config; 
    using System.Text; 

#endregion 
namespace campusMap.Controllers 
{ 
    [Filter(ExecuteWhen.BeforeAction, typeof(scriptFilter))] 
    [Layout("default"), Rescue("generalerror")] 
    public abstract class BaseController : MonoRailHelper.HelperBaseController 
    { 
    } 

,然後最後從。如果我基本上做同樣的事情squshit但在過濾器的

controllerContext.PropertyBag["cssBundle"] = Bundle.Css(); 

,並在教職員

$cssBundle.Add("~/Content/css/admin_styles.css").Add("~/Content/js/colorpicker/css/jpicker-1.1.6.min.css").Render("~/Content/css/min/admin.css") 

這一次,它至少只是輸出了兩個腳本標籤,而不是精縮或捆綁但至少它正在做一些事情。

有關如何做到這一點的任何想法? 謝謝-Jeremy

回答

0

所以這是如何完成的。這是使用squshitrejucier是以相同的方式完成。

BaseController.cs

#region Directives 
    using Castle.MonoRail.Framework; 
    using campusMap.Services; 
    using campusMap.Models; 
    using Castle.ActiveRecord; 
    using MonoRailHelper; 
    using campusMap.Filters; 
    //any others you'd need 
#endregion 
namespace campusMap.Controllers 
{ 
    [Filter(ExecuteWhen.BeforeAction, typeof(scriptFilter))] 
    [Layout("default"), Rescue("generalerror")] 
    public abstract class BaseController : MonoRailHelper.HelperBaseController 
    { 
     protected ScriptsService ScriptsService = new ScriptsService(); 
    } 
} 
在過濾

然後

scriptFilter.cs

#region using 
    using System; 
    using Castle.MonoRail.Framework; 
    using campusMap.Models; 
    using MonoRailHelper; 
    using campusMap.Services; 
#endregion 

namespace campusMap.Filters 
{ 
    public class scriptFilter : IFilter 
    { 
     protected ScriptsService scriptsService = new ScriptsService(); 
     public bool Perform(ExecuteWhen exec, IEngineContext context, IController controller, IControllerContext controllerContext) 
     { 
      controllerContext.PropertyBag["scriptsService"] = scriptsService; 
      return true; 
     } 
    } 
} 

你會看到,在這一點上要附加一個過濾器,每個調用都會被渲染,並將對服務的引用放置到屬性ba中因此我們可以訪問它。接下來是服務,所以我們可以提供訪問方法。

ScriptsService.cs

#region Directives 
    using System; 
    using campusMap.Models; 
    using MonoRailHelper; 
    using campusMap.Services; 
    using Castle.MonoRail.Framework; 
    using campusMap.Filters; 

    using SquishIt.Framework; 
    using SquishIt.Framework.Css; 
    using SquishIt.Framework.JavaScript; 
    using System.Security.Cryptography; 

#endregion 

namespace campusMap.Services 
{ 
    public class ScriptsService 
    { 
     public static string CalculateMD5Hash(string input) 
     { 
      // step 1, calculate MD5 hash from input 
      MD5 md5 = MD5.Create(); 
      byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input); 
      byte[] hash = md5.ComputeHash(inputBytes); 

      // step 2, convert byte array to hex string 
      StringBuilder sb = new StringBuilder(); 
      for (int i = 0; i < hash.Length; i++) 
      { 
       sb.Append(hash[i].ToString("X2")); 
      } 
      return sb.ToString(); 
     } 

     public static String Css(string files) 
     { 
      String name = CalculateMD5Hash(files); 
      String path = @"/cache/script/css/"; 
      String FilePath = path + name + ".css"; 

      if (!HelperService.DirExists(path)) 
      { 
       System.IO.Directory.CreateDirectory(path); 
      } 
      CSSBundle css = new CSSBundle();  
      foreach (string fl in files.Split(',')) 
      { 
       css.Add(fl); 
      } 
      return css.ForceRelease().Render(FilePath); 
     } 
     public static String Js(string files) 
     { 

      String name = CalculateMD5Hash(files); 
      String path = @"/cache/script/js/"; 
      String FilePath = path + name + ".js" ; 

      if (!HelperService.DirExists(path)) 
      { 
       System.IO.Directory.CreateDirectory(path); 
      } 
      JavaScriptBundle js = new JavaScriptBundle(); 
      foreach (string fl in files.Split(',')) 
      { 
       js.Add(fl); 
      } 
      return js.ForceRelease().Render(FilePath); 
     } 
    } 
} 

所以你會希望在服務需要注意的是,我們呼籲,爲我們提供一個基本名稱的方法參數的MD5哈希值。

就是這樣! ..查看容易設置。現在你如何使用它?

someView.vm

//CSS 
$scriptsService.Css("~/Content/css/jquery-ui-1.8.19.custom.css,~/Content/css/central_main.css,~/Content/css/map_admin.css,~/Content/css/colorbox.css?") 

//JS 
$scriptsService.Js("~/Content/js/modernizr-2.0.6/modernizr.min.js,~/Content/js/jquery.defaultvalue.js,~/Content/js/utilities_general.js,~/Content/js/infobox.js,~/Content/js/jquery.ui.map.js") 

需要注意的一點是從來都只是用手工清除緩存。Squshit會爲你打破客戶端,所以不用擔心觸摸文件。

就是這樣。

0

你需要把這個在Global.asax.cs中文件中的Application_OnStart方法中

OnRequest.ForCss("~/Content/css/min/Combined.css")

見本博客文章(不是我)adding the global.asax.cs file in aspnet web site

+0

好的。我會嘗試..但你如何告訴我們之間的區別讓我們說一邊爲管理員和一個爲公衆面向一邊..我會認爲做一個OnRequest.ForCss(「〜/ Content/css/min/Combined .css「)和OnRequest.ForCss(」〜/ Content/css/min/admin_Combined.css「)會導致麻煩?我很快會回頭看看是否有效。 tk - – 2012-07-13 00:58:00

+0

只需添加OnRequest.ForCss(「〜/ Content/css/min/Combined.css」)不起作用。你不能在那裏使用controllerContext.PropertyBag [「adminRejuicer_css」] = OnRequest.ForCss(「〜/ Content/css/min/Combined.css」)。嘿,你之前沒有一個城堡應用程序?我想如果你知道如何做到這一點,只需要複製粘貼來幫忙就會快得多。謝謝你的幫助..乾杯 - – 2012-07-13 01:04:42