2012-03-08 16 views
2

bodyタグにrunat = "server" & IDが設定されたmasterpageがあります。マスターページ上の背後bodyタグにcssクラスを追加するためのリフレクションc#

<body id="MasterPageBodyTag" runat="server"> 

コードの下に表示さ私は、次のコードを追加しました:

public HtmlGenericControl BodyTag 
{ 
    get { return MasterPageBodyTag; } 
    set { MasterPageBodyTag = value; } 
} 

今私はApp_CodeフォルダーにClass1.csファイルからbodyタグにCSSクラスを追加したいです。私がしたい私は

public static void FindPage(Control mp) 
{ 

    Page pg = (Page)HttpContext.Current.Handler; 


    PropertyInfo inf = mp.GetType().GetProperty("BodyTag");  

}

を以下しているClass1.csの上の今

protected void Page_Load(object sender, EventArgs e) 
{ 
    backend.FindPage((PageTemp)this.Master); 

} 

:.aspxのオン

は、次のコードを使用して、マスターページのコントロールを渡していますBodyTagを見つけるために以下を追加してください

//  BodyTag.Attributes.Add("class", "NewStyle"); 

しかし、atrributeを追加するか、infをHtmlGenericControlにキャストする方法が見つからないようです。

助けがあれば助かります。

+3

は、あなたがそれjQueryを使って、クライアント側または類似行うことはできませんか? –

+1

これはどんな使い方ですか? http://www.codeproject.com/Articles/95438/Changing-A-Master-Page-Body-Tag-s-CSS-Class-for-Di – Rawling

答えて

4

マスターページの種類に依存するのではなく、単にFindControlを使用してIdによってbody要素のアーチ。あなたもを検索することで、IDへの依存を取り除くことができ

private static MasterPage GetTopLevelMasterPage(Page page) 
{ 
    MasterPage result = page.Master; 
    if (page.Master == null) return null; 

    while(result.Master != null) 
    { 
     result = result.Master; 
    } 

    return result; 
} 

private static HtmlGenericControl FindBody(Page page) 
{ 
    MasterPage masterPage = GetTopLevelMasterPage(page); 
    if (masterPage == null) return null; 
    return masterPage.FindControl("MasterPageBodyTag") as HtmlGenericControl; 
} 

private void UpdateBodyCss() 
{ 
    HtmlGenericControl body = FindBody(this); 
    if(body != null) body.Attributes.Add(...); 
} 

:あなたが入れ子になったマスターページを使用しても仮定もありbodyタグがあなたのトップレベルのマスターページ上にあると仮定し、そして、それは次のようになります「体」のタグ名を持つHtmlGeneric制御:

private static HtmlGenericControl FindBody(Page page) 
{ 
    MasterPage masterPage = GetTopLevelMasterPage(page); 
    if (masterPage == null) return null; 
    foreach(Control c in masterPage.Controls) 
    { 
     HtmlGenericControl g = c as HtmlGenericControl; 
     if (g == null) continue; 
     if (g.TagName.Equals("body", StringComparison.OrdinalIgnoreCase)) return g; 
    } 
    return null; 
} 
+0

これは私のために働いた。私は解決策を使用してみました@ http://www.codeproject.com/Articles/19386/Adding-attributes-to-the-lt-body-tag-when-using-Maしかし、それを動作させることができませんでした。 – James

+0

私はこれを使ってタグを扱っていましたが、ContentPlaceHolderのコントロールとフォームがページソースでも読み込まれない原因は何ですか? – hsobhy

+0

をもっと具体的にするために、私は実際にInherits System.Web.UI.Pageで_Cultureという名前のクラスでソリューションを使用しました。次にPublicクラス_Default Inherits _Cultureのようなaspxページでこれを呼び出します – hsobhy

0

あなたがやっていることは少し畳み込まれているようで、おそらくこれに対処する簡単な方法があります。

あなたの質問にお答えするには、リフレクションを使用する必要はありません。渡すパラメータをFindPageにキャストするだけで、作成したマスターページタイプにキャストすることができます。

マスターページのタイプ名を指定していないので、名前をMyMasterPageとします。

のでFindPageは、次のようになります。

<%@ MasterType VirtualPath="~/Your_Master_Page.Master" %> 

、その後、あなたがあなたのページの.csファイルで行うことができます:あなたはASPXファイルに以下を追加必要

public static void FindPage(Control mp) 
{ 
    var masterPage = mp as MyMasterPage; 
    if (mp != null) 
    { 
     mp.BodyTag.Attributes.Add("class", "NewStyle"); 
    } 
} 
+0

私は依存関係を取るのではなく、IDでFindControlを使用したいマスターページタイプ。 – Joe

+0

このようにして、次のエラーが発生します。オブジェクト参照がオブジェクトのインスタンスに設定されていません。 – Chris

+0

@Joe:さらに良いアイデア:-) – dariom

1

Master.BodyTag.Attributes.Add("class", "NewStyle"); 
関連する問題