1

See below image first.

enter image description here

we have one sidebar navigation(ajax accordion control asp.net)

now when ever user click on link inside side bar related page(content) should display in Content goes here region.

As per given instruction entire page should not be refreshed or in other word in Back Button should not work(In Internet Explorer).

what should be the way to achieve this functionality?

what should be the best suggestion for that?

EDIT: navigation tree is inside MasterPage and Content goes region is in side content page of master page

please suggest me..... thank you so much....

4

3 に答える 3

1

によると:

指定された指示に従って、ページ全体を更新しないでください。つまり、[戻る] ボタンが機能しないようにする必要があります (Internet Explorer の場合)。

サイドバー ツリー ビューはマスター ページにあり、コンテンツはここに表示されます。領域はコンテンツ ページです。

私の理解が正しければ、ツリー ビューの選択に基づいてコンテンツを動的にロードするページが 1 つだけ必要TreeViewなため、マスター ページにコントロールを配置する必要はないと思います。それで...なぜこれが重要なのですか?ツリー ビューをページに配置すると、完全な投稿を避けるために を使用できます。UpdatePanel

次のコードの出力

ここに画像の説明を入力

次のコードは、次の点をカバーしています。

  • コントロールはにTreeView埋め込まれUserControl、ASPX ページに配置されます (左側)

  • メニュー コントロールは、選択したノードが変更されるたびに発生するイベントを公開します。このイベントは ASPX ページで処理され、ページの右側でのユーザーの選択に応じてユーザー コントロールを動的にロードします。一度に 1 つのコンテンツのみがロードされます。

  • コントロールは に埋め込まれているUpdatePanelため、ページを変更したり、ブラウザの戻るボタンに影響を与えたりすることはありません

注: ユーザー コントロールは、ポスト バック間で状態を維持します。

(これが最善の方法であるかどうかはわかりません。おそらく ajax のみを使用して解決策を見つけ、邪悪な更新パネルの使用を避けることができますが、確かにこれはそれを行う方法です)

投稿のサイズを小さくするためにコードを単純化しようとします。一方のユーザー コントロールのコードを投稿するだけです。

ASCX メニュー

<asp:TreeView ID="TreeView1" runat="server" onselectednodechanged="Unnamed2_SelectedNodeChanged">
    <Nodes>
        <asp:TreeNode Text="link1" />
        <asp:TreeNode Text="link2" />
    </Nodes>
    <SelectedNodeStyle Font-Bold="True" Font-Italic="True" />
</asp:TreeView>

ASCX メニュー コード ビハインド

    public event Action<string> MenuChanged = delegate { };

    protected void Unnamed2_SelectedNodeChanged(object sender, EventArgs e)
    {
        this.MenuChanged(this.TreeView1.SelectedNode.Text);
    }

ASPX

    <asp:ScriptManager runat="server" ID="sm" />
    <asp:UpdatePanel runat="server" ChildrenAsTriggers="true">
        <ContentTemplate>
            <asp:HiddenField runat="server" ID="currentControl" />
            <table border="0" cellpadding="0" cellspacing="0" width="90%" align="center">
                <tr>
                    <td style="width:50%; background-color: Silver">
                        <menu:TreeViewMenu runat="server" ID="myTreeViewMenu" OnMenuChanged="myTreeViewMenu_MenuChanged" />
                    </td>
                    <td style="width:50%; background-color: Aqua">
                        <p>Result:</p>
                        <asp:Panel runat="server" ID="myPanel">
                        </asp:Panel>
                        <asp:Label ID="lblMessage" runat="server" />
                    </td>
                </tr>
            </table>
        </ContentTemplate>
    </asp:UpdatePanel>

ASPX コードビハインド

    protected void Page_Init(object sender, EventArgs e)
    {
        if (this.IsPostBack)
        {
            var cc = this.Request.Form["currentControl"];

            if (!string.IsNullOrWhiteSpace(cc))
            {
                var uc = this.LoadControl(this.Server.HtmlDecode(cc));
                this.myPanel.Controls.Add(uc);
            }
        }
    }
    protected void myTreeViewMenu_MenuChanged(string e)
    {
        this.myPanel.Controls.Clear();

        switch (e)
        {
            case "link1":
                var cc1 = "~/Content1.ascx";
                this.currentControl.Value = this.Server.HtmlEncode(cc1);
                var uc1 = this.LoadControl(cc1);
                this.myPanel.Controls.Add(uc1);
                this.lblMessage.Text = "Updated from: link1";
                break;
            case "link2":
                var cc2 = "~/Content2.ascx";
                this.currentControl.Value = this.Server.HtmlEncode(cc2);
                var uc2 = this.LoadControl(cc2);
                this.myPanel.Controls.Add(uc2);
                this.lblMessage.Text = "Updated from: link2";
                break;
            default:
                this.lblMessage.Text = "Updated from default: " + e;
                break;
        }
    }

ASCX

<h1>Content 1</h1>

<asp:TextBox runat="server" ID="txt" />
<asp:Button Text="Process data..." runat="server" OnClick="button_Click" />
<asp:Button Text="Just post" runat="server" />

<asp:Label ID="lblMessage" runat="server" />

ASCX コード ビハインド

    protected void button_Click(object sender, EventArgs e)
    {
        this.lblMessage.Text = this.txt.Text;
    }

このコードをコピーして貼り付けて自分でテストするだけで、うまくいくはずです

于 2012-07-13T08:48:58.310 に答える
1

Jupaolの答えは正常に機能しますが、言及する必要がある1つのことは、Jupaolのアイデアを実装した後に問題に遭遇したことです。メニューをクリックした直後にユーザーコントロールを初めて呼び出したとき、ascxのボタンは正常に動作しますが、2番目に切り替えると1 つ目は、2 番目のコントロールのボタンを最初にクリックしても、最初のクリックでは起動しません。これは、コントロールの「静的」ID がないためです。なぜこれが起こっているのかを最終的に理解するのに、ほぼ3日かかりました。これが私のコードの一部です。後にこれを読んだ人がそれを利用することを願って、私はこのメッセージを残しています.

if (!string.IsNullOrEmpty(controlPath))
{
    PlaceHolder1.Controls.Clear();
    UserControl uc = (UserControl)LoadControl(controlPath);

    /**note below LastLoadedControl is anything that could
     * be unique to the called control so every time when call back
     * it will not confuse the back end so the first fire of eg. a button
     * on that loaded control will work
     */
    uc.ID = LastLoadedControl;
    PlaceHolder1.Controls.Add(uc);
}

また、サイトを運営できるように、Jupaol の多大な貢献に感謝する必要があります。

于 2012-08-17T01:48:57.613 に答える
1

最も簡単な方法は、サイド ナビゲーションと Content プレースホルダーを でラップすることUpdatePanelです。TreeViewサイドバーの をUpdateTrigger更新パネルのとして設定します。しかし、このアプローチは少し非効率的です。

少し良い方法は、コンテンツ プレースホルダーを更新パネルにラップするだけHiddenFieldです。サイドバーでの選択時に、HiddenField 値をJavaScript更新し、更新パネルを更新します。

于 2012-07-13T05:31:15.380 に答える