Mr.Tです、こんにちは。
オレだけはまったMemo。
ASP.NETのMenuコントロールとMenuItemオブジェクトを利用してMenuを作った際に、はまった。
解決はできていたのだが、挙動の理由がわからなかった。
もっと最初にピンとくればよかった。
MenuItemのヘルプにはこう書いてある。
同じメニュー レベルにあるメニュー項目は、それぞれの Value プロパティの値が一意であることが必要です。同一レベルの複数のメニュー項目でこの値が同じであると、Menu コントロールは各メニュー項目を区別できません。この場合、重複した値を持つメニュー項目をユーザーがクリックすると、最初にメニューに表示されているメニュー項目が選択されます。
これは、Valueをプログラム上で利用しないからといってValue=""としてはだめよ、ということだ。
<asp:Menu>
<Items>
<asp:MenuItem Text="取込関連" Value="">
<asp:MenuItem Text="各種マスタ取込" Value="***.aspx" NavigateUrl=""></asp:MenuItem>
<asp:MenuItem Text="初期データ生成" Value="***.aspx" NavigateUrl=""></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="帳票関連" Value="">
<asp:MenuItem Text="一品毎表示" Value="***.aspx" NavigateUrl=""></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="計算処理" Value="">
<asp:MenuItem Text="計算" Value="***.aspx" NavigateUrl=""></asp:MenuItem>
</asp:MenuItem>
</Items>
</asp:Menu>
これだと、一番最初の「各種マスタ取込」にあるメニューは利用できるが、その下のメニュー項目については、
例えば、「一品毎表示」をクリックすると、PostBackはされるが
「各種マスタ取込」に「一品毎表示」のValuePathを持ったMenuItemがないと、MenuItemClickイベントが発生しない。
ためしに、「一品毎表示」のMenuItemと同じものを「各種マスタ取込」に含めてやると、実行される。Textを変更しても実行される
ので、ValuePathが同一ならOKという解釈である。
ただし、Valueそのものを指定しなかった場合やTextを指定しなかった場合は、片方に指定してる値がそのまま利用されるので
問題ない。
Text プロパティを設定し、Value プロパティを設定しないと、Value プロパティには Text プロパティと同じ値が自動的に設定されます。その反対も同様です。Value プロパティを設定し、Text プロパティを設定しないと、Text プロパティには Value プロパティと同じ値が自動的に設定されます。
わかってしまえば、こんなものです...
それと、NavigateUrlに指定すると、指定先URLにPostBackはされません。<A>タグでのリンクと同じ動きになります。
LinkButtonのようにあえて別ページにPostBackしたい場合は、MenuItemClickイベント内でValueにURL渡すなりして、
その値でServer.Transferするなどで、対処すればよさそうです。