13

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();

無駄に。場所を特定するにはどうすればよいですか?

4

5 に答える 5

12

マスターページ内から:

var literal = (Literal)FindControl("MainLinks").FindControl("litNavLinks");
literal.Text = sb.ToString();

ビュー内から:

litNavLinks.Text = sb.ToString();
于 2010-09-16T21:40:38.680 に答える
1

別のアプローチを試してみます。

ユーザー コントロールを使用し、関連するプロパティを公開して、テキスト値を取得または設定するのはどうでしょうか。

プロパティは、リテラル コントロールにアクセスします。ただし、プロパティを呼び出すページは賢明ではありません。

私たちは OO の世界に住んでいることを思い出してください。

于 2010-09-16T21:48:09.280 に答える
1

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();
于 2010-09-16T21:57:02.073 に答える
1

これを行う必要があると思いますが、今すぐ再確認するコードがありません。

Page.Master.FindControl("MainLinks").FindControl("litNavLinks");
于 2010-09-16T21:50:58.337 に答える
-1
Literal tbx = this.Controls.Find("Literal1", true).FirstOrDefault() as Literal;
于 2016-01-19T11:04:00.267 に答える