2011-01-14 25 views
2

MVC 2アプリケーションでページテーマを動的に変更したいと思います。 私はいくつかのソリューションを見つけたが、私はこの方法を使用したい:私はしました ...ASP .NET MVC 2:動的テーマ

protected void Application_PreRequestHandlerExecute(object sender, System.EventArgs e) 
    { 
     // cast the current handler to a page object 
     Page p = HttpContext.Current.Handler as Page; 

     if (p != null) 
     { 
      string strTheme = "Theme1"; 
      if (Convert.ToString(HttpContext.Current.Session["THEME"]) != string.Empty) 
       strTheme = Convert.ToString(HttpContext.Current.Session["THEME"]); 
      p.StyleSheetTheme = strTheme; 
     } 
    } 

しかし、このコードは常に「P」にnullを返します:Global.asaxの中で、現在のページのテーマを変更しますまた、ページ

としてHttpModuleをでイベントPreRequestHandlerExecuteを使用して、同様のコードとページのPREINITイベントが、コード

HttpContext.Current.Handlerを試してみました、常にnullを返します。

誰でも手伝ってもらえますか? ありがとうございます。

+0

MVCハンドラはページではありません。 – SLaks

+0

以下のリンクに掲載されているコードはすべて間違っていますか? http://forums.asp.net/p/1424103/3168832.aspx http://forums.asp.net/p/1400562/3029482.aspx http://stackoverflow.com/questions/58123/finding -system-web-ui-page-from-httpcontext – mbp

+0

この手法は、MVCでは機能しません。 – SLaks

答えて

3

私はテーマで焼き付けはしませんが、私はjQuery UIテーマを使用します。私がそれを処理する方法は、私のマスターページにあります。私は、共通のビューモデルから現在のテーマを取得するロジックを持っています。マスターページは、このビューモデルに強く入力されます。一般的なviewmodelのプロパティは、すべてのマイコンが継承する共通ベースコントローラのユーザ設定やその他のソースから更新されます。私はOnActionExecutedでこれを行います。結果がViewResultかどうかを確認し、ActionExecutedContext.ResultプロパティのViewDataからの結果を共通ビューモデルにキャストしてプロパティを設定します。マスターページはプロパティの値を使用してCSSファイルのURLを作成します。

モデル

public abstract class CommonViewModel 
{ 
    public string Theme { get; set; } 
    // ... 
} 

コントローラ

public abstract class BaseController : Controller 
{ 
    public override void OnActionExecuted(ActionExecutedContext context) 
    { 
      if (context.Result is ViewResult) 
      { 
       var model = ((ViewResult)context.Result).ViewData.Model as CommonViewModel; 
       if (model != null) 
       { 
        var preferences = ...get from database for current user... 
        model.Theme = preferences.Theme; 
       } 
      } 
    } 
} 

マスターノートでは、それはあなたが 手でそれを行うことができ、スタイルシートのリンクを生成するためにカスタムのHtmlHelperを使用しています。

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<...CommonViewModel>" > 

<%: Html.Stylesheet("themes/" + Model.Theme + ".css") %> 
+0

あなたのテクニックを共有していただきありがとうございます、私はそれを調査します。 – mbp

0

asp.net MVCではなく、標準asp.netで動作するテクニックについて話しています。その理由は、(一般的に)asp.net MVCはasp.net標準のWebコントロールモデルを使用しないため、テーマ設定を解釈するものは何もないからです。

@tvanfossonには大きなアドバイスがあります。 MVCを使えば、物事をもっとはるかにコントロールできることを忘れないでください。しかし、標準asp.netが提供する機能のいくつかを無料で手に入れるためには、もっと多くの作業をしなくてはなりません。 MVCは多くのことを簡単にしますが、これはその1つではありません。