2012-07-07 42 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