我有一个多租户应用程序,我正在尝试根据任何传入请求的URL确定最简单的方法来控制捆绑哪些CSS文件。
我想我可以在RegisterBundles()中有一些条件逻辑,它将Url作为字符串,并相应地捆绑:
public static void RegisterBundles(BundleCollection bundles, string tenant = null) {
if (tenant == "contoso"){
bundles.Add(new StyleBundle("~/contoso.css")
}
}
但我不知道如何将字符串传递给RegisterBundles,即使它是可能的,也不是正确的解决方案。这里的任何帮助都会很棒。
答案 0 :(得分:6)
现在无法在RegisterBundles中执行此操作。动态生成每个请求的bundle内容将阻止ASP.net缓存缩小的CSS(它在HttpContext.Cache中缓存)。
您可以做的是在RegisterBundles中为每个租户创建一个捆绑包,然后在视图中选择适当的捆绑包。
视图中的示例代码:
@Styles.Render("~/Content/" + ViewBag.TenantName)
编辑:
正如您所说,在ViewBag中设置TenantName是有问题的,因为您必须为每个视图执行此操作。解决此问题的一种方法是创建一个静态函数,如Styles.Render(),它根据当前租户选择正确的包名称。
public static class TenantStyles
{
public static IHtmlString Render(params string[] paths)
{
var tenantName = "test"; //get tenant name from where its currently stored
var tenantExtension = "-" + tenantName;
return Styles.Render(paths.Select(i => i + tenantExtension).ToArray());
}
}
用法
@TenantStyles.Render("~/Content/css")
捆绑名称需要采用此格式{bundle} - {tenant},如〜/ Content / css-test。但你可以改变课程的格式。
答案 1 :(得分:1)
我认为您正在寻找一种允许您动态控制BundleCollection的解决方案。据我所知,目前这是不可能的。 在应用程序启动期间配置捆绑包/根据应用程序域配置捆绑包。 未来版本的ASP.NET可能支持此功能,使用VirtualPathProvider。 Here是一些讨论。
另见this SO问题。
答案 2 :(得分:0)
我的英语不好,但是如果你的意思是你需要在你的页面中运行任何URL时处理哪个CSS文件加载,我可以在一个控制器中处理css文件。
首先,创建一个控制器名称:ResourceController
// CREATE PATH TO CSS FOLDER, I store in webconfig <add key="PathToStyles" value="/Content/MyTheme/" />
private static string _pathToStyles = ConfigurationManager.AppSettings["PathToStyles"];
public void Script(string resourceName)
{
if (!String.IsNullOrEmpty(resourceName))
{
var pathToResource = Server.MapPath(Path.Combine(_pathToScripts, resourceName));
TransmitFileWithHttpCachePolicy(pathToResource, ContentType.JavaScript.GetEnumDescription());
}
}
public void Style(string resourceName)
{
if (!String.IsNullOrEmpty(resourceName))
{
var pathToResource = Server.MapPath(Path.Combine(_pathToStyles, resourceName));
TransmitFileWithHttpCachePolicy(pathToResource, ContentType.Css.GetEnumDescription());
}
}
private void TransmitFileWithHttpCachePolicy(string pathToResource, string contentType)
{
//DO WHAT YOU WANT HERE;
Response.ContentType = contentType;
Response.TransmitFile(pathToResource);
}
//You can handle css or js file...
private enum ContentType
{
[EnumDescription("text/css")]
Css,
[EnumDescription("text/javascript")]
JavaScript
}
在文件Global.asax.cs中,确保在应用程序启动方法中,包含路由配置
protected void Application_Start()
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
转到routeConfig,将下面的地图添加到此文件中(必须添加到此文件的顶部):
routes.MapRoute(
name: "Resource",
url: "resource/{action}/{resourceName}",
defaults: new { controller = "Resource" }
);
现在,创建一个UrlHelperExtensions类,与webconfig文件相同的路径
public static class UrlHelperExtensions
{
public static string Style(this UrlHelper urlHelper, string resourceName)
{
return urlHelper.Content(String.Format("~/resource/style/{0}", resourceName));
}
}
从现在开始,您可以在视图中定义css文件,如:
...“&lt;”link href =“@ Url.Style(”yourcss.css“)”rel =“stylesheet”type =“text / css” /&GT;