3

シナリオ:Webサイトのすべてのページの上部に、いくつかのボタンで構成されるメニューバーがあります。一部のページには、同じことを行う同じ量のボタンがあります(たとえば、ページへのリダイレクト)が、一部のボタンは、現在ページにある情報に依存しています。問題:ページごとに処理できるように、コントロールのボタンをオーバーライドできるようにしたいと思います。また、イベントを使用して、そのように処理する方が簡単かもしれないと考えていました。これらのアプローチのいずれかが可能であり、そうでない場合は代替手段がありますか?

私が現在持っているコードは以下の通りです

aspxページで

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        Dim myMenu As MenuBar
        myMenu = CType(Master.FindControl("MenuBar1"), MenuBar)
        myMenu.ShowButtons(MenuBar.Buttons.NewOrganization, MenuBar.Buttons.NewEquipment, MenuBar.Buttons.ChangeEquipmentOwner, MenuBar.Buttons.ChangeEquipmentLocation)

    End If
End Sub

ascxコントロール

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        RaiseEvent myEvent(sender, e)
    End If
End Sub
Public Sub ShowButtons(ByVal ParamArray args() As Buttons)
    For i As Integer = 0 To args.GetUpperBound(0)
        SetVisible(args(i))
    Next
End Sub
Public Enum Buttons
    NewOrganization = 1
    NewEquipment = 2
    ChangeEquipmentOwner = 3
    ChangeEquipmentLocation = 4
    UnderDevelopment = 5
    CheckoutEquipment = 6
    EditDocument = 7
    CreateEquipmentLoanForm = 8
End Enum
Private Sub SetVisible(ByVal btn As Buttons)
    Select Case (btn)
        Case 1
            btnNewOrganization.Visible = True
        Case 2
            btnNewEquipment.Visible = True
        Case 3
            btnChangeOwner.Visible = True
        Case 4
            btnChangeLocation.Visible = True
        Case 5
            btnUnderDevelopment.Visible = True
        Case 6
            btnCheckoutEquipment.Visible = True
        Case 7
            btnEditDocument.Visible = True
        Case 8
            btnCreateEquipment.Visible = True
    End Select
End Sub
4

1 に答える 1

4

私がすることは、メニューコントロールなどのために予約されるマスターページのコンテンツプレースホルダーを使用することです。その後、各ページでメニューコントロールを提供できます。

この手法を使用すると、マスターページ/ページロジックを結合することなく、各ページで目的の効果に合わせてコントロールを調整できます。それだけでなく、各ページは、マスターページで使用する1つのコントロールと結合されません。ある時点で、他のページに影響を与えずに、別のメニューコントロールまたは完全に異なるメニューコントロールを含めたい場合があります。

ただし 、コンテンツページからマスターページを絶対に操作する必要があり、私のアイデアを受け入れない場合は、たとえばC#を使用してこれを行うことができます(ただし、この場合はVB.NETに簡単に適合させることができます)。

マスターページCodeBehind

マスターページのコードビハインドにメソッドを追加してください。次のようなものです。

public void updateMenuControlWithOptions(MenuOptions options)
{
     //Tailor your menu control based on provided options
     //Menu1.FooButton.Visible = options.FooButtonVisible;
}

ASPX

必ず次のディレクティブをページに追加してください。これがなぜ役立つのかが少しわかります。また、マスターページの名前を自分のものに変更してください。

<%@ MasterType VirtualPath="~/Main.Master" %>

ASPX CodeBehind

if (foo)
    whateverOptions.FooButtonVisible = true;

this.Master.updateMenuControlWithOptions(whateverOptions);

マスターを型キャストする必要がなかったことに注意してください。これは、aspxに含めたMasterTypeディレクティブが原因です。

于 2012-06-15T18:05:35.553 に答える