在ASP.net VB中从子页面访问母版页属性

8
我有一个名为masterpage.master.vb的文件,在其中我有一些属性,例如:
 Private _SQLerror As String
    Public Property SQLerror() As String
        Get
            Return _SQLerror
        End Get
        Set(ByVal value As String)
            _SQLerror = String.Empty

        End Set
    End Property

我有一个属性,需要在aspx页面中使用,例如:

 If **[masterpage property sqlerror]** = Nothing Then
            InternalSQLErrLabel.Text = ("No Errors Reported")
        End If

有人能给我一个关于如何处理这个问题的想法吗?我已经尝试搜索,但大多数文章都是在web控件的上下文中...

谢谢。

4个回答

8

请看以下内容:

如何:引用ASP.NET母版页内容

从这篇文章来看,似乎

If Master.SQLerror = Nothing Then
    InternalSQLErrLabel.Text = ("No Errors Reported")
End If

希望这对你有用。

只需确保按照说明添加MasterType指令,否则可能会出现类型转换错误。(或者像daRoBBie在他的答案中建议的那样使用您的主页类型变量而不是Master。)

我创建了一个测试网站来测试它,它可以工作。以下是该网站的完整源代码:

Site1.Master:

<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site1.master.vb" Inherits="WebApplication1.Site1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        This is the Master Page content.
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

Site1.Master.vb:

Public Partial Class Site1
    Inherits System.Web.UI.MasterPage

    Private _SQLerror As String

    Public Property SQLerror() As String
        Get
            Return _SQLerror
        End Get
        Set(ByVal value As String)
            _SQLerror = String.Empty
        End Set
    End Property
End Class

WebForm1.aspx:

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site1.Master"
    CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1" %>

<%@ MasterType VirtualPath="~/Site1.Master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    This is the Content Page content.
    <asp:Label ID="InternalSQLErrLabel" runat="server" Text="Label"></asp:Label>
</asp:Content>

WebForm1.aspx.vb:

Public Partial Class WebForm1
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Master.SQLerror = Nothing Then
            InternalSQLErrLabel.Text = ("No Errors Reported")
        End If
    End Sub

End Class


这就是我在提问之前尝试的,但没有成功!... 我得到了“SQLError不是system.web.ui.masterpage的成员”的错误。 - Phil
你是否添加了MasterType指令?看起来这可能是你的问题。Master属性没有强类型,因此它的类型是System.Web.UI.MasterPage,它没有你的属性。 - Andy West
我有 <%@ MasterType VirtualPath="/my.master”" %> 和 @page MasterPageFile="/my.master"。 - Phil
我建立了一个测试网站来展示这个工作。请看一下。除此之外,我没有更多的事情可以做了。 - Andy West
非常有帮助,非常感谢。我现在已经让它工作了,并将您标记为最佳答案。Phil。 - Phil
2
如果你按照Andy的指示做了一切,但仍然无法正常工作:将属性放在主页面中,重新构建项目......然后关闭Visual Studio。重新打开它,尝试内容页部分。我在这上面花费了大约2个小时,才记得有时候会发生这种情况。啊! - user2014183

3

您可以将主页面转换为正确的类型:

MyMasterPageType m = (MyMasterPageType)Master;

然后您可以访问您的属性:

m.SqlError

如果您有多个主控页,让所有的主控页都继承一个接口,并将主控页强制转换为该接口。

1

你也可以使用 <%@ MasterType %> 来实现这个功能。


0
如果您按照Andy West的回答所述步骤操作,但出现一个或多个编译错误,如:Foo is not a member of 'System.Web.UI.MasterPage',请确保它们是列表中唯一的编译错误。如果还有其他需要修复的编译错误,请在继续排除MasterPage问题之前先修复它们。
这些其他编译错误可能会阻止编译器解析您的MasterPage并检测到额外的属性。解决它们后,请进行完整的重新编译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接