C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ASP.NET SiteMapPathコントロールについて


(過去ログ 131 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■77417 / inTopicNo.1)  ASP.NET SiteMapPathコントロールについて
  
□投稿者/ Ante (1回)-(2015/10/19(Mon) 14:12:22)

分類:[ASP.NET (VB)] 

お世話になります。

■環境
ASP.NET
VisualStudio2010
.NetFramework3.5
VB.NET
IIS7.5

SiteMapPathコントロールをマスターページに配置しています。
Web.sitemapが仮想ディレクトリに配置されており、SiteMapPathはそれを自動的に読込んでいます。

各ページでSiteMapPathコントロールのクリックイベントを取得したいのですが、
SiteMapPathコントロールにはクリックイベントが用意されておらず、取得できません。

SiteMapPathコントロールによるイベントの取得は不可でしょうか。
大人しくMenuコントロールをにWeb.sitemapをSiteMapDataSource1として食わせてもいいのですが、
SiteMapPathコントロールと同様な階層で表現するにはどうすればよいかわかっておりません。

SiteMapPathコントロールがクリックされたかのイベントを拾えればいいだけなのですが。。。

既出でしたら申し訳ありませんが、何かしら教示いただけたら幸いです。

以上です。
引用返信 編集キー/
■77424 / inTopicNo.2)  ASP.NET SiteMapPathコントロールについて
□投稿者/ kiku (72回)-(2015/10/19(Mon) 18:58:43)
2015/10/19(Mon) 19:02:44 編集(投稿者)

削除
引用返信 編集キー/
■77438 / inTopicNo.3)  Re[1]: ASP.NET SiteMapPathコントロールについて
□投稿者/ WebSurfer (677回)-(2015/10/20(Tue) 11:44:38)
No77417 (Ante さん) に返信

局所的な疑問の質問だけでなく、全体的なシナリオを含めてどういうことがやりたい
のか説明できませんか?

そうしてもらえると、局所的な問題の解決は無理でも、やりたいことはこうすれば実
現できると言うような代案のアドバイスが出てくるかもしれませんので。


質問者さんは、サーバー側で起こっていることと、クライアント側で起こっていること
の区別が付いているでしょうか? イベントというのはサーバー or クライアントのど
ちらで発生するものを言ってますか?

サーバー側で、あるコントロールにイベントを発生させようとしたら ViewState とポス
トバックが必須です。

SiteMapPath が ASP.NET によって html にレンダリングされるとどうなるか、ブラウ
ザに表示されたら html ソースを見てください。一つ一つの要素は以下のような a タ
グになっていませんか?(「迷惑投稿者と判定」になってしまうので、以下で "<" と
">" は全角にしてますので注意してください)

<span><a title="説明" href="/abc/sample.aspx">sample</a></span>

であれば、それをクリックすると、ブラウザは /abc/sample.aspx を GET 要求するこ
とになります。

ポストバックするわけではないので、サーバー側のイベントは発生させようがありませ
ん。

a タグのイベントに JavaScript のリスナを設定するというようなことはできると思い
ますので、そのリスナで何かできるかもしれません。ただ、それで質問者さんのやりた
いことを実現できるかどうかはわかりませんが。(何かやりたいのか書いてもらえたら
考えてみます)

引用返信 編集キー/
■77454 / inTopicNo.4)  Re[2]: ASP.NET SiteMapPathコントロールについて
□投稿者/ Ante (2回)-(2015/10/21(Wed) 12:55:33)
WebSurfer さん

ご回答ありがとうございます。

端的に言うとサイトマップパスコントロールがクリックされたら、
サーバー側のイベントでセッションを破棄したかっただけです。

大人しく動的コントロールを生成することでイベントを拾い解決することにしました。

◆aspx
<asp:Panel ID="pnlSiteMap" runat="server">
</asp:Panel>

◆aspx.vb
    ''' <summary>
    ''' サイトマップを生成する
    ''' </summary>
    ''' <param name="dt">生成元データテーブル</param>
    ''' <remarks></remarks>
    Private Sub CreateSiteMaps(ByVal dt As DataTable)
        Me.pnlSiteMap.Controls.Clear()

        Dim lastIndex As Integer = dt.Rows.Count - 1

        Dim st As System.Text.StringBuilder

        For i As Integer = 0 To dt.Rows.Count - 1

            MyLinkBtn = New LinkButton
            MyLinkBtn.ID = "btn_" & i
            MyLinkBtn.Text = dt.Rows(i).Item("NAME")
            'MyLinkBtn.PostBackUrl = dt.Rows(i).Item("URL")
            MyLinkBtn.Enabled = dt.Rows(i).Item("ENABLED")
            MyLinkBtn.ToolTip = dt.Rows(i).Item("NAME")

            '◆イベント追加
            AddHandler MyLinkBtn.Click, AddressOf siteMap_Click
            Me.pnlSiteMap.Controls.Add(MyLinkBtn)

            If i <> lastIndex Then

                st = New System.Text.StringBuilder
                st.AppendLine("<span> &gt; </span>")
                MyWkTag = New Label
                MyWkTag.Text = st.ToString

                Me.pnlSiteMap.Controls.Add(MyWkTag)
            End If

        Next

    End Sub

    ''' <summary>
    ''' サイトマップパスクリックイベント
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub siteMap_Click(sender As Object, e As EventArgs)

        Session(mdlGlobal.gcSessDispParam) = Nothing

        Dim key As String = DirectCast(sender, LinkButton).Text
        Dim nextUrl As String = GetSiteMapValue(key)
        Call Response.Redirect(nextUrl)

    End Sub

解決済み
引用返信 編集キー/
■77455 / inTopicNo.5)  Re[3]: ASP.NET SiteMapPathコントロールについて
□投稿者/ WebSurfer (679回)-(2015/10/21(Wed) 16:17:27)
No77454 (Ante さん) に返信

DataTable に web.sitemap の情報を取得してそれから LinkButton を使った
自作 SiteMapPath を Panel 内に作成しているようですが、web.sitemap を作
っているなら SiteMap オブジェクトから情報を取得したほうが良いと思います。

SiteMap クラス
https://msdn.microsoft.com/ja-jp/library/system.web.sitemap(v=vs.100).aspx

SiteMap オブジェクトは ASP.NET によって自動的に生成されるサイトのナビゲ
ーション構造のインメモリ表現で、単純に SiteMap として参照が取得できます。

それを使って、質問者さんが行ったように Panel に LinkButton を利用した
自作 SiteMapPath を作ると以下のような感じになります。ご参考まで。

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        List<SiteMapNode> nodeList = new List<SiteMapNode>();
        CreateNodeList(SiteMap.CurrentNode, nodeList);

        for (int i = nodeList.Count - 1; i >= 0; i--)
        {
            if (i == 0)
            {
                Literal literal = new Literal();
                literal.Text = nodeList[i].Title;
                Panel1.Controls.Add(literal);
            }
            else
            {
                LinkButton button = new LinkButton();
                button.Text = nodeList[i].Title;
                button.ToolTip = nodeList[i].Description;
                button.CommandName = "navigate";
                button.CommandArgument = nodeList[i].Url;
                button.Click += new EventHandler(button_Click);
                Panel1.Controls.Add(button);
                Literal literal = new Literal();
                literal.Text = " &gt; ";
                Panel1.Controls.Add(literal);
            }
        }
    }

    // CurrentNode から RootNode までたどって List<SiteMapNode> を作る。
    // web.sitemap に url は設定済み、かつ一意の条件。
    protected void CreateNodeList(SiteMapNode node, List<SiteMapNode> nodeList)
    {
        nodeList.Add(node);

        if (node.Url == SiteMap.RootNode.Url)
        {
            return;
        }
        else
        {
            CreateNodeList(node.ParentNode, nodeList);
        }
    }

    protected void button_Click(object sender, EventArgs e)
    {
        if (((LinkButton)sender).CommandName == "navigate")
        {
            // ここでセッションをクリア
            Response.Redirect(((LinkButton)sender).CommandArgument);
        }
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

    <h3>標準コントロールの SiteMapPath</h3>
    <asp:SiteMapPath ID="SiteMapPath1" runat="server">
    </asp:SiteMapPath>

    <hr />

    <h3>LinkButton で自作した SiteMapPath</h3>
    <asp:Panel ID="Panel1" runat="server">
    </asp:Panel>
    
    </form>
</body>
</html>

他のページにも使用するならユーザーコントロールにしたほうかいいかもしれま
せん。

解決済み
引用返信 編集キー/
■77496 / inTopicNo.6)  Re[3]: ASP.NET SiteMapPathコントロールについて
□投稿者/ WebSurfer (682回)-(2015/10/25(Sun) 13:09:21)
No77454 (Ante さん) に返信

今さらながらですが、LinkButton を使ったパンくずリストを自力で作るより、
標準の SiteMapPath コントロールを使ってそのテンプレートで LinkButton
を実装するのがはるかに簡単でした。

Web.sitemapに Title, Url, Descriptin が正しく定義されていることが前提
ですが、以下のような感じです。

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        if (((LinkButton)sender).CommandName == "navigate")
        {
            
            // ここでリダイレクトする前に必要な処置を行う
            
            Response.Redirect(((LinkButton)sender).CommandArgument);
        }
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

    <asp:SiteMapPath ID="SiteMapPath2" runat="server">
        <NodeTemplate>
            <asp:LinkButton 
                ID="LinkButton1" 
                runat="server"
                Text='<%# Eval("Title") %>'
                ToolTip='<%# Eval("Description") %>'
                CommandName="navigate" 
                CommandArgument='<%# Eval("Url") %>' 
                OnClick="LinkButton1_Click">
            </asp:LinkButton>
        </NodeTemplate>
        <CurrentNodeTemplate>
            <asp:Literal 
                ID="Literal1" 
                runat="server" Text='<%# Eval("Title") %>'>
            </asp:Literal>
        </CurrentNodeTemplate>
    </asp:SiteMapPath>

    </form>
</body>
</html>

引用返信 編集キー/
■77505 / inTopicNo.7)  Re[4]: ASP.NET SiteMapPathコントロールについて
□投稿者/ WebSurfer (684回)-(2015/10/26(Mon) 09:58:48)
解決済みマークを付け忘れました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -