web-dev-qa-db-ja.com

Asp.NetでプログラムによるStyleSheetsの追加

プログラムでヘッドセクションにStyleSheetsを追加したいのですが、多くのコードが必要な場合でも、1つのスタイルシートだけを追加するには、コードの何行も必要な例が1つありました。

サンプルコード:

_HtmlLink css = new HtmlLink();
css.Href = "css/fancyforms.css";
css.Attributes["rel"] = "stylesheet";
css.Attributes["type"] = "text/css";
css.Attributes["media"] = "all";
Page.Header.Controls.Add(css);
_

Page.Header.RenderControl()メソッドも使用していますが、機能しませんでした。オブジェクトnull何かエラーがスローされました。

_Page.Header.InnerHtml_と_InnerText += "<link .... "/>_も使用しましたが、一般的なエラーと思われるリテラルエラーがスローされました。

私はこのコードを使用しました:

_List<Literal> cssFiles = new List<Literal>();
cssFiles.Add(new Literal() { Text = @"<link href=""" +   ResolveUrl("~/Resources/Styles/MainMaster/MainDesign.css") + @""" type=""text/css"" rel=""stylesheet"" />" });
cssFiles.Add(new Literal() { Text = @"<link href=""" + ResolveUrl("~/Resources/Styles/MainMaster/MainLayout.css") + @""" type=""text/css"" rel=""stylesheet"" />" });
AddStyleRange(cssFiles);

private void AddStyleRange(List<Literal> cssFiles)
{
   foreach (Literal item in cssFiles)
   {
     this.Header.Controls.Add(item);
   }
}
_

最初は動作しましたが、ページを変更すると動作しなくなりました。

私はマスターページを使用していて、これらのコードを_Master.cs_ファイルに書いています。また、一部の人々は_this.Header_ではなく_Page.Header_の使用を推奨していますが、ビルドすると宣言できないというエラーがスローされますこんな感じ.

多くのスタイルを追加することはそれほど難しくありません。

複雑になっています。

25
Tarik

さて、これが私が現在使用しているソリューションです:

ヘルパークラスを作成しました:

using System.Web.UI;
using System.Web.UI.WebControls;

namespace BusinessLogic.Helper
{
    public class CssAdder
    {
        public static void AddCss(string path, Page page)
        {
            Literal cssFile = new Literal() { Text = @"<link href=""" + page.ResolveUrl(path) + @""" type=""text/css"" rel=""stylesheet"" />" };
            page.Header.Controls.Add(cssFile);
        }
    }
}

そしてこのヘルパークラスを通じて、私がしなければならないのは:

CssAdder.AddCss("~/Resources/Styles/MainMaster/MainDesign.css", this.Page);
CssAdder.AddCss("~/Resources/Styles/MainMaster/MainLayout.css", this.Page);
CssAdder.AddCss("~/Resources/Styles/Controls/RightMainMenu.css", this.Page);
//...

そのため、1行の簡単なコードで必要なだけ追加できます。

また、マスターページとコンテンツページの関係でも機能します。

それが役に立てば幸い。

P.S:このソリューションと他のソリューションのパフォーマンスの違いはわかりませんが、よりエレガントで使いやすいように見えます。

44
Tarik

私のために働いたものを貼り付けます:

HtmlLink link = new HtmlLink();
//Add appropriate attributes
link.Attributes.Add("rel", "stylesheet");
link.Attributes.Add("type", "text/css");
link.Href = "/Resources/CSS/NewStyles.css";
link.Attributes.Add("media", "screen, projection");
//add it to page head section
this.Page.Header.Controls.Add(link);

これについてはたくさん検索しましたが、ボタンがクリックされたときにオーバーライドスタイルシートを追加します。上記のコードを使用しましたが、完全に機能しました。

5
Kay

一般的なHTMLを定義します<link>およびプログラムでhref属性を設定します。

たとえば、ページ<head> 私が持っています:

<link id="cssStyle" runat="server" rel="stylesheet" type="text/css" />.

次に、Page_LoadでcssStyleのHrefプロパティを設定します。

cssStyle.Href = "path/to/Styles.css";

<link>希望の順序で。

3
J. Horn

私は一歩進んで、ClientScriptManager.RegisterClientScriptInclude()のようなものを含めて、重複を追加することを不可能にするメソッドが必要でした。解決策は、ヘッダーセクションに追加されたコントロールにIDを与えることです。

if (!String.IsNullOrEmpty(Key))
     if (Page.Header.FindControl(Key) != null) return;

HtmlLink link = new HtmlLink();
if (!String.IsNullOrEmpty(Key)) link.ID = Key;
link.Href = StyleUrl; 
link.Attributes.Add("type", "text/css"); 
link.Attributes.Add("rel", "stylesheet");
Page.Header.Controls.Add(link);

私が書いた完全な記事について: http://www.idea-r.it/Blog.aspx?Article=49

2
Igor De Ruitz