テキストを挿入できるように、見つけようとしているLiteral
コントロールがあります。いくつかのコンテンツプレースホルダーを含むマスターページがあります。
<asp:Content ID="Content7" ContentPlaceHolderID="MainLinks" runat="server">
<h3>Project Navigation</h3>
<ul class="rightColBoxNav">
<asp:Literal ID="litNavLinks" runat="server" />
</ul>
</asp:Content>
「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示され続けます。このオブジェクトを見つけて更新できるようにするにはどうすればよいですか?
私が試してみました:
((Literal)Page.FindControl("litNavLinks")).Text = sb.ToString();
((Literal)Page.Page.FindControl("litNavLinks")).Text = sb.ToString();
((Literal)Page.FindControl("Content7").FindControl("litNavLinks")).Text = sb.ToString();
無駄に。場所を特定するにはどうすればよいですか?
マスターページ内から:
var literal = (Literal)FindControl("MainLinks").FindControl("litNavLinks");
literal.Text = sb.ToString();
ビュー内から:
litNavLinks.Text = sb.ToString();
別のアプローチを試してみます。
ユーザーコントロールを使用し、関連するプロパティを公開してテキスト値を取得または設定するのはどうですか。
プロパティはリテラルコントロールにアクセスします。ただし、プロパティを呼び出すページは賢明ではありません。
私たちはOOの世界に住んでいることを忘れないでください。
私はあなたがこれをしなければならないと思います、しかし私は今再確認する私のコードを持っていません:
Page.Master.FindControl("MainLinks").FindControl("litNavLinks");
ASP ContentPlaceHolderコントロール は「ネーミングコンテナ」です(INamingContainerインターフェイスを実装します)。 Control.FindControlsメソッド は指定したIDを持つコントロールの現在のネーミングコンテナ。
「/」で区切られた文字列を受け入れて、ページ上の名前付けコンテナを任意にナビゲートするユーティリティ関数をときどき含めました。次の実装のようなもの。 (注:このコードをコンパイルまたはテストしようとしたことはありません)
public static Control FindControlByPath(this Control start, string controlPath)
{
if(controlPath == null)
throw new ArgumentNullException("controlPath");
string[] controlIds = controlPath.split('/');
Control current = start;
if(controlIds[0] == "") // in case the control path starts with "/"
current = start.Page; // in that case, start at the top
for(int i=0; i<controlIds.Length; i++)
{
switch(controlIds[i])
{
case "":
// TODO: handle syntax such as "<controlId>//<controlId>", if desired
break;
case ".":
// do nothing, stay on the current control
break;
case "..":
// navigate up to the next naming container
current = current.Parent;
if(current == null)
throw new ArgumentOutOfRangeException("No parent naming container exists.", "controlPath");
while(!(current is INamingContainer))
{
current = current.Parent;
if(current == null)
throw new ArgumentOutOfRangeException("No parent naming container exists.", "controlPath");
}
break;
default:
current = current.FindControl(controlIds[i]);
break;
}
}
return current;
}
したがって、あなたの場合、次のことができるはずです。
<some control>.FindControlByPath("/MainLinks/litNavLinks").Text = sb.ToString();
または
Page.FindControlByPath("MainLinks/litNavLinks").Text = sb.ToString();