CSSファイルをその場で(動的に)変更したいと思います。私はRazorビューを使用してMVC4で開発しています。現時点では、それらはweb.configからプルされています...
バンドル登録
bundles.Add(New StyleBundle("~/Content/themes/" + Domain.GetTheme + "/css").Include(
"~/Content/themes/" + Domain.GetTheme + "/Main.css",
"~/Content/themes/" + Domain.GetTheme + "/Content.css"))
かみそりの眺め
@Styles.Render("~/Content/themes/" + Domain.GetTheme + "/css")
GetThemeプロパティのコード
Public Shared ReadOnly Property GetTheme As String
Get
Return ConfigurationManager.AppSettings("Theme")
End Get
End Property
これが最善の方法かどうかはわかりませんが、機能します。
これまでの研究...
しかし今、私はその場でテーマを変更したいと思います。私の最初のアイデアは、クエリ文字列パラメータにアクセスすることでした。したがって、?Theme = Greenが含まれている場合、CSSファイルは緑色のバージョンを取得します。クエリ文字列の値はセッション状態で保存されるため、CSSはクエリ文字列を介して再度変更されるまで緑色を使用し続けます。
まず、コントローラーに適用できる属性を作成しました...
属性
Public Class LoadThemeAttribute
Inherits ActionFilterAttribute
Public Overrides Sub OnActionExecuted(filterContext As ActionExecutedContext)
MyBase.OnActionExecuted(filterContext)
If HttpContext.Current.Request.QueryString("Theme") IsNot Nothing Then
HttpContext.Current.Session("Theme") = HttpContext.Current.Request.QueryString("Theme")
End If
End Sub
End Class
コントローラ
<LoadTheme>
Public Class CompanyController
Inherits System.Web.Mvc.Controller
...
End Class
次に、_Layout.vbhtmlレイザービューで、CSSファイルを次のようにオーバーライドします。-
@If Session("Theme") IsNot Nothing Then
@<link href="/Content/themes/@Session("Theme")/Main.css" rel="stylesheet"/>
@<link href="/Content/themes/@Session("Theme")/Content.css" rel="stylesheet"/>
Else
@Styles.Render("~/Content/themes/" + Domain.GetTheme + "/css")
End If
Renderステートメントを使用できませんでした。これは、プロジェクトの読み込み時に一度呼び出され、再度呼び出すことができないためだと思います。私は確かにそれを機能させることができませんでした。
だから私の質問はこれです:-すべてがうまくいくようですが、これが良いアプローチであるかどうかを知りたいだけです-それはCSSファイルを変更するための良いMVC方法ですか?