- PR -

ユーザーコントロールを使用したメニューのイベント取得について

1
投稿者投稿内容
当主
会議室デビュー日: 2006/12/10
投稿数: 16
投稿日時: 2007-10-03 10:42
お世話になっております、当主です。
件名のことで困っていることがあるので、助言をいただけますと幸いです。

 環境:WindowsXP、VS2005、ASP.NET(C#)
 前提:ユーザーコントロールにMenuを配置したものを用意。
     ログイン時に格納してある権限から、項目をフィルタリングして
     権限を持たない項目は表示しない。
    (Web.sitemapとWeb.Configでロールを使用して実現)
 事象:メニューをクリックした際のイベントOnMenuItemClickイベントが効かない。

以上のような内容です。

ユーザーコントロールのメニューにイベントを用意し、
 <asp:Menu OnMenuItemClick="Menu1_Click" …>
コード側で
 protected void Menu1_Click(object sender,MenuEventArgs e)
 { … }
を用意すれば動くと思ったのですが、配置元のフォームで何か処理が必要なのでしょうか。

実現したいことは、サイトマップメニューから画面を遷移を行った場合、
Sessionに格納してある項目をクリアしたいのです。
(もちろんユーザーIDや必要な項目は残します)


過去ログは拝見させていただいたのですが、試行錯誤の結果
どうしてもうまくできなかったので投稿させていただきました。
ヒント等よろしくお願いいたします。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2007-10-09 16:25
亀レスだけど。。。

SiteMapDataSource を用いるということであってます?
Web.sitemap とバインドさせた結果の HTML を見ると、ただのアンカータグにレンダリングされるようなので、href を殺して PostBack するように JavaScript でゴニョゴニョすればなんとかなりそうな気がします。
当主
会議室デビュー日: 2006/12/10
投稿数: 16
投稿日時: 2007-10-09 18:02
お返事ありがとうございます。

その後手段を変更し、ロールを使用したフィルタリングをやめることにしました。
現在は<asp:Menu〜だけ配置し、ユーザーの権限から機械的に.ChildItems.Addしていくことにしました。

そこで簡単にテストデータで作ったバージョンではOnMenuItemClickイベントは動くんですが、本番環境に近いソリューションに書き写したところ、イベントが動かなくなりました。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38400&forum=7&0
このあたりも参考にしたのですが、見当はずれのようで未だに解決できておりません。


いったい何が要因でイベントが動かなくなっているのか、引き続き助言をよろしくお願いいたします。


当主
会議室デビュー日: 2006/12/10
投稿数: 16
投稿日時: 2007-10-09 19:04
:補足です。


参考に挙げてあるURLの方も同じ症状のようですが、私の環境でも先頭の項目にだけ
イベントが動作することが確認できました。

項目1  : 項目2  : 項目3
 項目11   項目21   項目31
 項目12            項目311
                  項目322

上記のようなメニュー項目になっており、初期表示は項目1,2,3。
オンマウスでその他の項目が動的に表示されます。
その中でイベントが動くのは項目1だけです。


いったい何が原因なのか……皆目検討がつきません。

引き続きヒントなどありましたらよろしくお願いいたします。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2007-10-10 06:56
手動でロール別のメニューを切り替えるのではなく、
ASP.NET 2.0のセキュリティトリミングを利用して自動化したらどうでしょうか。

コード:
<add name="XmlSiteMapProvider" description="Default SiteMap provider" 
     type="System.Web.XmlSiteMapProvider" 
     siteMapFile="Web.sitemap" 
     securityTrimmingEnabled="true"/>


_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
当主
会議室デビュー日: 2006/12/10
投稿数: 16
投稿日時: 2007-10-10 11:03
Access様

コメントありがとうございます。
当初はその手段で実現していましたが、いくつかの理由で現在の形になりました。

まず確認です。セキュリティトリミングを行う場合は以下の流れで
実現だと考えていましたが、正しいでしょうか。

 :Web.Configで各ページ・各フォルダのアクセス権限設定を行う。
 :ロールを作成し、ユーザーに設定(正確にはロールの中にユーザーを含める?)
 :.sitemapを用意し、表示できる項目にロールを書き込んでおく。


そして現在の機械的にメニューを作ることにした理由は以下です。

 ・ロール作成などで自動的に作られるASPNETDBの扱いがわからない(本番はOracleを予定)
  ロール作成時に重過ぎてタイムアウトエラーになったりすることがあった。

 ・権限が40種類・ページが150ページほどあり、権限の追加・変更やページの追加の際、
  サイトマップファイル、コンフィグファイル、ログインページ(ロールの作成)の
  3箇所を変更しなくてはならず、見通しが悪くなる恐れがある

 ・ロール設定するユーザーコントロール内の処理は、機械的にメニューを追加する処理とあまり変わらない。
  =1箇所で管理できる現在の形のほうが良い


以上が現状になります。
イベントが動作するのであればロールを使用した方法に再修正しますが、何もなければ現在の形で決定です。

だいぶ散らかってしまい申し訳ないですが、引き続きアドバイス等お待ちしております。
当主
会議室デビュー日: 2006/12/10
投稿数: 16
投稿日時: 2007-10-12 11:19
お世話になっております、当主です。


その後、メニュー項目にURLが設定されているとイベントが動かないことがわかりました。
サイトマップとして作ったものなのに、URL記入するとイベントが動かないなんて…

ということでURLに設定するのではなくValueに設定し、OnMenuItemClickイベントが動いた先で
Valueから取得したURL(string)へResponse.Redirectさせるようにしました。


それだと、メニュー項目のonMouse時ステータスバーの表示がうまくいかないんですね。
(アンカーでURL指定じゃないので当たり前かもしれないですが)


ASP.NETはいいのですが、JavaScriptまで絡んでくると手に負えないです…。
上記のステータスバーの件で、何かアドバイスあればよろしくお願いいたします。


要はメニュー項目にマウスが乗っているとき、正しいURLがステータスバーに表示されるようにしたいのです。
今やってみたコードです。

Default.aspx
<div onmouseover="onMouse()" runat="server">
<uc1:WebUserControl id="WebUserControl" runat="server" />
</div>

Default.aspx.cs
protected string onMouse()
{
return "window.status = http://localhost/xxxxx.aspx";
}

こんな感じで動けば、ユーザコントロールから値取ってきて階層に応じたstring作って
ステータスに設定できるかなーと思ったのですが…。

[ メッセージ編集済み 編集者: 当主 編集日時 2007-10-12 12:11 ]



ネタが変わったので、新スレッド投稿しました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=41668&forum=7&0

[ メッセージ編集済み 編集者: 当主 編集日時 2007-10-12 15:01 ]
1

スキルアップ/キャリアアップ(JOB@IT)