C# 在.NET4下的castle中使用小型服务器和绑定器
我已经尝试了squshit和rejuicer,尝试在视图中合并和缩小一些css和js。到目前为止没有运气。我所做的是在一个过滤器里C# 在.NET4下的castle中使用小型服务器和绑定器,c#,.net,c#-4.0,.net-4.0,castle,C#,.net,C# 4.0,.net 4.0,Castle,我已经尝试了squshit和rejuicer,尝试在视图中合并和缩小一些css和js。到目前为止没有运气。我所做的是在一个过滤器里 #region using using System; using Castle.MonoRail.Framework; using campusMap.Models; using MonoRailHelper; using Rejuicer; #endregion namespace campusMap.Filters {
#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
{
}
最后从视图中的
$adminRejuicer_css.File("~/Content/css/admin_styles.css").File("~/Content/js/colorpicker/css/jpicker-1.1.6.min.css")
但什么都没有。如果我对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您需要将其放入应用程序启动方法中的Global.asax.cs文件中
OnRequest.ForCss(“~/Content/css/min/Combined.css”)
请看这篇博文(不是我的),就是这样做的。这是在使用squshit,但是rejuncier也是这样做的 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();
}
}
#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;
}
}
}
#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);
}
}
}
然后在过滤器里
scriptFilter.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();
}
}
#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;
}
}
}
#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);
}
}
}
您将看到,在这一点上,您将为每个调用附加一个筛选器,所有内容都将呈现,并将对服务的引用放置到属性包中,以便我们可以访问它。接下来是服务,因此我们可以提供访问的方法
ScriptsService.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();
}
}
#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;
}
}
}
#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);
}
}
}
需要注意的一点是,永远不要只是手动清除缓存。Squshit将为您中断客户端,因此不必担心触摸文件
就这些。好的。我试试看。。但是,你如何区分,让我们说一边是管理员,一边是正面的公众面孔。。我认为在OnRequest.ForCss(“~/Content/css/min/Combined.css”)和OnRequest.ForCss(“~/Content/css/min/admin\u Combined.css”)上做一个会引起麻烦吗?我很快会回来看看这是否有效。tk——简单地添加OnRequest.ForCss(“~/Content/css/min/Combined.css”)不起作用。您也不能在那里使用controllerContext.PropertyBag[“administrationer\u css”]=OnRequest.ForCss(“~/Content/css/min/Combined.css”)。嘿,你以前没有使用过这个castle应用程序吗?我想如果你知道怎么做的话,只需要复制粘贴来帮助你会快得多。谢谢你的帮助。。干杯--