0

マスター ページ "default.master" とコンテンツ ページ "Store.aspx" があり、それぞれに独自のコード ビハインド ページがあります。マスター ページのコード ビハインドで、テキストを含むラベルを動的に作成しています。'Store.aspx.cs' のコード ビハインド ページでラベルのテキストを検索したいのですが、私のコードは 'null' コントロールを返しています...

ページ読み込み時の default.master.cs で:

<label runat=\"server\" id=\"displayname\"><a href='MyAvatar.aspx'>" + displayName + "</a></label>

ページ読み込み時の Store.aspx.cs :

HtmlGenericControl dName = (HtmlGenericControl)Master.FindControl("displayName");
if (dName != null)
    Debug.Print("dName: " + dName.InnerText);

これは機能しません...ただし、次のように default.master ページに直接ラベルを付けると:

<label runat="server" id="displayName">TEST</label>

次に、Store.aspx をロードすると、デバッグ出力にはっきりと表示されます。

dName: TEST

ラベルを動的に作成する必要があり、Store.aspx.cs からだけでなく、他の 2 つのページからもラベルのコンテンツにアクセスできる必要があります (将来的にはさらに増える可能性があります)。何か案は??

編集:動的に作成されたラベルはより大きな要素の一部であることに注意したかっただけです...ラベルはテーブルセル内、テーブル行内、テーブル内にあり、そのすべてがリテラルコントロール内にあります...何一体、ここに全部貼り付けてみませんか?(ラベルは4行目にあります)

userCP.Text = "<table width=100% border=0 cellpadding=0 cellspacing=0>" +
                            "<tr><td colspan=4 style=\"font-size: large\"><center><b>Welcome,</b></center></td></tr>" +
                            "<tr style=\"height: 5px; \"><td colspan=4></td></tr>" +
                            "<tr><td colspan=4><center><label runat=\"server\" id=\"displayname\"><a href='MyAvatar.aspx'>" + displayName + "</a></label></center></td></tr>" +
                            "<tr style=\"height: 5px; \"><td colspan=4></td></tr>" +
                            "<tr><td colspan=4><hr/></td></tr>" +
                            "<tr><td>" + leaderLink + "</td><td width=100% id=\"userCP_bones\" style=\"text-align:right; \">" + bones + "</td><td style=\"text-align:left;\"><b>/</b><a href='Store.aspx?SC=Acct' title='Click to upgrade your wallet!'>" + maxBones + "</a></td><td><center><img src='images/bone.png' alt='Bones' align='right' style=\"vertical-align:middle\"/></center></td></tr>" +
                            "<tr><td></td><td></td><td id='CartCount' style=\"text-align:right; text-decoration: underline; cursor:pointer; \"><a href='Checkout.aspx'>" + itemCount + "</a></td><td width=10%><center><a href='Checkout.aspx'><img src='images/cart.png' onmouseover=\"this.src='images/cart_h.png'\" onmouseout=\"this.src='images/cart.png'\" height='24' width='24' alt='Cart' align='right' style=\"vertical-align:middle; border:none\"/></a></center></td></tr>" +
                          "</table>";

編集:最初の回答に基づいて、「userCP」のリテラル コントロールの代わりに、それを ASP テーブルに変換し、コード ビハインドに行/セルを追加しました。

//Row for display name
            TableRow r = new TableRow();
            userCP.Rows.Add(r);
            TableCell c = new TableCell();
            r.Cells.Add(c);
            c.ColumnSpan = 4;
            Label l = new Label();
            l.Text = "<center><a href='MyAvatar.aspx'>" + displayName + "</a></center>";
            l.ID = "displayName";
            c.Controls.Add(l);

私の store.aspx.cs は、実行時にまだ null を返しています。

Debug.Print("Name: " + Master.FindControl("displayName"));

ルックアップをキャストしても:

(HtmlGenericControl)Master.FindControl("displayName")
(Label)Master.FindControl("displayName")
4

2 に答える 2

0

回答とコメントをクリーンアップ、明確化、および一元化するためだけに:

LiteralControl を使用するか、Asp:Table を使用するかは問題ではありません。必要な 'displayName' は、default.master.cs ファイルにグローバル変数として格納されます。

string displayName = "Guest";

public string dName()
{
    return displayName;
}

また、以下を使用して、任意のコンテンツ ページから検索できます。

//Make sure the user has an account
string dName = ((_default)Master).dName();
if (dName == "Guest")
{
    LiteralStoreHeader.Text = "<center><b>We're Sorry!</b><br/>You must have an Avatar account to view this page.</center>";
    return;
}

ただし、default.master.cs ページに変数として保存せずにテーブルのセルから情報を取得する必要がある場合は、LiteralControl の代わりに ASP テーブルを使用して検索することもできます。ラベルの ID:

マスター コード ファイル:

Label l;

public string FOO()
{
    return l.Text;
}

protected void Page_Load(object sender, EventArgs e)
{
    l = new Label();
    l.Text = "Bar";
}

コンテンツ コード ファイル:

string dName = ((_default)Master).FOO();
于 2013-06-05T19:43:02.093 に答える