3

场景:网站上的每个页面顶部都会有一个菜单栏,由许多按钮组成。某些页面具有相同数量的按钮来执行相同的操作(例如重定向到页面),但某些按钮取决于页面上当前的信息。问题:我希望能够覆盖控件上的按钮,以便我可以按页面处理它。我也在想也许使用事件并以这种方式处理它会更容易。这些方法中的任何一种是否可能,如果没有,是否有替代方法?

我目前拥有的代码如下

在 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):

母版代码隐藏

请务必在您的母版页代码隐藏中添加一个方法。像这样:

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

ASPX

请务必将以下指令添加到页面。您很快就会明白为什么这会有所帮助,还将我的母版页名称更改为您的名称:

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

ASPX 代码隐藏

if (foo)
    whateverOptions.FooButtonVisible = true;

this.Master.updateMenuControlWithOptions(whateverOptions);

请注意,我不必键入强制转换 master..这是因为我包含在 aspx 中的 MasterType 指令。

于 2012-06-15T18:05:35.553 回答