ステータスメッセージのラベルを含むマスターページがあります。さまざまな.aspxページからステータステキストを設定する必要があります。これをコンテンツページからどのように行うことができますか?
public partial class Site : System.Web.UI.MasterPage
{
public string StatusNachricht
{
get
{
return lblStatus.Text;
}
set
{
lblStatus.Text = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
私はこれを試しましたが、それを機能させることに失敗しました:
public partial class DatenAendern : System.Web.UI.Page
{
var master = Master as Site;
protected void Page_Load(object sender, EventArgs e)
{
if (master != null)
{
master.setStatusLabel("");
}
}
protected void grdBenutzer_RowCommand(object sender, GridViewCommandEventArgs e)
{
try
{
//some code
if (master != null)
{
master.setStatusLabel("Passwort erfolgreich geändert.");
}
}
catch (Exception ex)
{
if (master != null)
{
master.setStatusLabel("Passwort konnte nicht geändert werden!");
}
}
}
}
}
MasterPage.csファイルで、property
of Label
を次のように追加します。
public string ErrorMessage
{
get
{
return lblMessage.Text;
}
set
{
lblMessage.Text = value;
}
}
aspx
ページで、ページディレクティブのすぐ下に以下を追加します。
<%@ Page Title="" Language="C#" MasterPageFile="Master Path Name"..... %>
<%@ MasterType VirtualPath="Master Path Name" %> // Add this
codebehind(aspx.cs)
ページで、Label Property
に簡単にアクセスし、必要に応じてtext
を設定できます。このような:
this.Master.ErrorMessage = "Your Error Message here";
[コンテンツ]ページでは、ラベルにアクセスして、次のようなテキストを設定できます。
ここで、「lblStatus」はマスターページのラベルIDです。
Label lblMasterStatus =(Label)Master.FindControl( "lblStatus"); lblMasterStatus.Text = "コンテンツページからの測定";
できます
子ページでマスターページコントロールを見つけるには
Label lbl_UserName = this.Master.FindControl("lbl_UserName") as Label;
lbl_UserName.Text = txtUsr.Text;
System.Web.UI.Pageクラスにこのためのヘルパーメソッドがあります
protected T FindControlFromMaster<T>(string name) where T : Control
{
MasterPage master = this.Master;
while (master != null)
{
T control = master.FindControl(name) as T;
if (control != null)
return control;
master = master.Master;
}
return null;
}
次に、以下のコードを使用してアクセスできます。
Label lblStatus = FindControlFromMaster<Label>("lblStatus");
if(lblStatus!=null)
lblStatus.Text = "something";
フィールドでvar
を使用することはできません 、ローカル変数のみ。
しかし、これでも機能しません:
Site master = Master as Site;
フィールドでthis
を使用できず、Master as Site
はthis.Master as Site
と同じであるためです。したがって、ページが完全に初期化されたらPage_Init
からフィールドを初期化し、this
を使用できます。
Site master = null;
protected void Page_Init(object sender, EventArgs e)
{
master = this.Master as Site;
}
ネストされたMasterPageがある場合、これはより複雑です。最初に、ネストされたMasterPageを含むコンテンツコントロールを見つけてから、そこからネストされたMasterPage上のコントロールを見つける必要があります。
重要なビット:Master.Master。
こちらをご覧ください: http://forums.asp.net/t/1059255.aspx?Nested+master+pages+and+Master+FindControl
例:
'コンテンツコントロールを見つける
Dim ct As ContentPlaceHolder = Me.Master.Master.FindControl( "cphMain")
'そのコンテンツ内のコントロールを見つけます
Dim lbtnSave As LinkButton = ct.FindControl( "lbtnSave")
Html要素にアクセスしようとしている場合:これはHTMLアンカーです...
ナビゲーションバーにリストアイテム(<li>
)ではなく、HTMLアンカー(<a>
)のアイテムがあります
以下を参照してください:(これはサイトマスターです)
<nav class="mdl-navigation">
<a class="mdl-navigation__link" href="" runat="server" id="liHome">Home</a>
<a class="mdl-navigation__link" href="" runat="server" id="liDashboard">Dashboard</a>
</nav>
別のページのコードビハインドでは、私の場合はログインページです...
PageLoad()でこれを定義します:
HtmlAnchor lblMasterStatus = (HtmlAnchor)Master.FindControl("liHome");
lblMasterStatus.Visible =false;
HtmlAnchor lblMasterStatus1 = (HtmlAnchor)Master.FindControl("liDashboard");
lblMasterStatus1.Visible = false;
これで、サイトマスターコントロールにアクセスし、ログインページで非表示にしました。