2011-08-16 1 views
1

マスターページでcontentplaceholderコントロールを使用して、コンテンツエディタがdivの背景として使用する画像のURLを指定できるようにしています。ASP.NET:エディタ/デザイナのエラーなしで属性値にcontentplaceholderを使用するにはどうすればよいですか?

<div id="content-left-column" 
    style="background-image: url('<wc:UrlContentPlaceHolder runat='server' ID='leftContentBackgroundUrl'></wc:UrlContentPlaceHolder>');"> 

プレースホルダは、同様のコンテンツページで参照されています

<asp:Content ID="Content1" ContentPlaceHolderID="leftContentBackgroundUrl" runat="server">/img/left-content.jpg</asp:Content> 

ページがうまく、このアプローチを使用してレンダリングします。しかし、ソースビューでコンテンツページを見ると、ContentPlaceHolderId属性値に下線が引かれ、「現在のマスターページに「leftContentBackgroundUrl」が見つかりませんでした」という警告が表示されます。

デザインビューは、このエラーのためにコンテンツページを表示しません。

Visual Studioエディターとデザイン面にエラーが報告されないように、属性値にContentPlaceHolderを使用する方法はありますか?

*私はこのアプローチの問題を認識しています。コンテンツエディタがスペースに入れたり、キャリッジが戻るか、ビジュアルスタジオでドキュメントフォーマットを実行すると、レンダリングされた属性値は破損します。 ContentPlaceHolderのサブクラスを作成して、その値をトリムし、ResolveClientUrlを使用してこれらの問題に対処しました。議論のために、通常のContentPlaceHolderコントロールに影響を与える問題について説明しました。

次のスタックオーバーフローの質問は、ContentPlaceHolderを属性値と共に使用できますが、デザインサーフェイスの問題には対処していないという事実に対処しています。 Why can't I use a ContentPlaceholder inside HTML attributes in ASP.NET?

答えて

1

このソリューションは、@ atticaeの応答に触発されました。

マスターページでは、通常のContentPlaceholderコントロールにvisible = "false"を含めました。以前にそのContentPlaceholderを属性値として使用していた場所では、代わりにMasterPageのプロパティ、LeftBackgroundImageUrlを参照していました。 ContentPlaceHolderのサブクラスを使用して

<asp:ContentPlaceHolder runat='server' ID='leftContentBackgroundUrl' Visible="false"/>   
<div id="content-left-column" style="background-image: url('<%: LeftBackgroundImageUrl%>');"> 

私は通常のContentPlaceHolderの使用に戻った理由であるコンテンツページのデザイン面でエラーが発生します。

LeftBackgroundImageUrlプロパティのコードは次のようになります。

ReadOnly Property LeftBackgroundImageUrl As String 
    Get 
     Return RenderResolvedUrl(leftContentBackgroundUrl) 
    End Get 
End Property 

Private Function RenderedResolvedUrl(control As Control) As String 
    Dim visible As Boolean = control.Visible 
    control.Visible = True 
    Dim result As String = Nothing 
    Using writer As New System.IO.StringWriter() 
     Using htmlWriter As New System.Web.UI.HtmlTextWriter(writer) 
      control.RenderControl(htmlWriter) 
      htmlWriter.Flush() 
     End Using 
     result = Page.ResolveClientUrl(writer.ToString.Trim).Trim 
    End Using 
    control.Visible = visible 
    Return result 
End Function 

このソリューションは、画像のURLを宣言的に指定することができ、かつMasterTypeディレクティブを追加することなしに、ユーザー。これは編集/設計時に、エディタが提供するコンテンツがURLまたはアプリケーションの相対URLであることを検証しないという意味で完璧ではありません。しかし、ユーザーはコードを書く必要がありません。

2

私はそれがContentPlaceHoldersの使い方を信じていません。このためにインラインコードを使用することを強くお勧めします。

Main.master:

<div id="content-left-column" 
    style="background-image: url(<%: LeftContentBackgroundURL %>);"> 

Main.master.cs:

public string LeftContentBackgroundURL { get; set; } 

ContentPageでは、あなたは、単に@MasterTypeディレクティブを使用し、分離コードでプロパティを設定します。

Content.aspx:

<%@ MasterType VirtualPath="~/Main.master" %> 

Content.aspx.cs:

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.Master.LeftContentBackgroundURL = "/img/left-content.jpg"; 
} 
+0

質問に固有の回答を提供し、私が投稿した解決策のインスピレーションを提供してくれてありがとうと感謝したい。私はあなたが質問に答える時間を取ってくれたことに信用を与えたいと思っているので、私は葛藤していますが、本当の答えは私が投稿したものです。あなたは答えとしてどれをマークするべきだと思いますか?いずれの場合も、あなたの答えを+1しました。 –

+0

質問に最もよく答えると思われる回答を受け入れる必要があります。それがあなたのものなら、それはまあまあです。私は助けることができてうれしいです。 – magnattic

関連する問題