覆盖母版页上控件中的功能

时间:2012-06-15 18:03:19

标签: asp.net vb.net master-pages

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

我目前的代码位于

之下

在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

1 个答案:

答案 0 :(得分:4)

我要做的是在您的母版页上使用内容占位符,这些内容占位符将保留用于菜单控件之类的内容。然后每个页面都可以提供菜单控件。

使用此技术将使您的每个页面都能够将控件定制为所需的效果,而无需耦合母版页/页面逻辑。不仅如此,每个页面都不会与您在母版页上使用的1控件结合。您可能在某些时候想要包含另一个菜单控件或完全不同的菜单控件而不影响任何其他页面。

<强> BUT 如果您绝对必须从内容页面与主页面进行交互,并且您不接受我的想法,那么您可以使用C#(例如在您的情况下可以轻松地适应VB.NET)来执行此操作:

Masterpage 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指令。