【问题标题】:How can I make my content page manipulate controls on the master page?如何让我的内容页面操纵母版页上的控件?
【发布时间】:2014-05-09 12:23:24
【问题描述】:

我的内容页面允许我操作数据,因此它们的代码包含错误处理块。我想做的是在母版页的模式窗口中设置几个标签的文本值,以便向用户显示错误消息:

<!-- master page -->
<div runat="server" id="divModalBg" class="modalbg"> </div>
<div runat="server" id="divErrorModal" class="modal">
    <asp:Label runat="server" id="lblErrorTitle"></asp:Label>
    <asp:Label runat="server" id="lblErrorMessage"></asp:Label>
    <asp:Button runat="server" id="btnRetry" text="Retry" />
</div>

我不确定如何在我的内容页面中设置这些标签的值...

// Users.aspx.cs
protected void btnUpdate_Click(object sender, EventArgs e)
{
    try
    {
        // do some stuff
    }
    catch(Exception ex)
    {
        // lblErrorTitle = "Update User";
        // lblErrorMessage = String.Format("Error actioning request: [ {0} ]", ex.Message);
        // btnRetry just closes the modal (sets visible to false) so that
        // the user can try again
    }
}

那么如何访问母版页上的控件以便执行此操作?

我正在考虑母版页上的属性,将它们设置为 onPageLoad...

编辑
根据mason下面的回答,我已经做到了……

// Default.master
// properties for error handling
public virtual Label ErrorTitle { get { return lblErrorAction; } }
public virtual Label ErrorMessage { get { return lblErrorMessage; } }
public virtual Panel ErrorBG { get { return pnlErrorBackground; } }
public virtual Panel ErrorModal { get { return pnlErrorModal; } }

这是我的指令:

<%@ MasterType VirtualPath="~/Default.master" %>

这是我的代码文件

// Users.aspx.cs
private void deleteUser(int userid)
{
    ImajUser u = new ImajUser(userid, true);
    try
    {
        u.Delete();

        lblerr.Text = "User was deleted successfully.";
        lblerr.ForeColor = System.Drawing.Color.Green;
    }
    catch (Exception ex)
    {
        Page.Master.ErrorTitle.Text = "Delete User";
        Page.Master.ErrorMessage.Text = String.Format("Error actioning request: [ {0} ]", ex.Message);
        Page.Master.ErrorBG.Visible = true;
        Page.Master.ErrorModal.Visible = true;

    }

现在每个控件都出现以下错误:

“System.Web.UI.MasterPage”不包含“ErrorTitle”的定义,并且找不到接受“System.Web.UI.MasterPage”类型的第一个参数的扩展方法“ErrorTitle”(您是否缺少using 指令还是程序集引用?)

【问题讨论】:

    标签: c# asp.net master-pages content-pages


    【解决方案1】:

    虽然 Thor 的回答会奏效,但还有更好的方法。通过将其放入 ASPX 文件中来设置内容页面上的主类型。显然,将 TypeName 替换为母版页代码中的类名称。

    <%@ MasterType TypeName="MyMasterClassName" %>
    

    这使您的母版页可以从内容页进行强类型访问。然后,要访问 MasterPage 上的控件(默认为 privateprotected,不确定是哪个),您需要使用属性将它们公开为 public。所以把它放在你的母版页代码后面......

    public virtual Label LblErrorMessage { get {return lblErrorMessage;}}
    

    然后从你后面的代码中,你可以这样访问它...

    Master.LblErrorMessage.Text="Hello, world!";
    

    【讨论】:

    • 顺便说一下,如果你想实现客户端错误通知,有一个更好的方法。使用客户端通知库,我最喜欢的是Noty。我曾经使用简单的标签和计时器,就像你会尝试的那样,但是让客户端脚本处理它被证明是一个更优雅的解决方案。
    • 它似乎不起作用...'System.Web.UI.MasterPage' does not contain a definition for 'ErrorTitle' and no extension method 'ErrorTitle' accepting a first argument of type 'System.Web.UI.MasterPage' could be found (are you missing a using directive or an assembly reference?)
    • @Ortund 我已经更新了我的答案,如果你看一下,我稍微修改了 MasterType 指令。
    • 好的,我的母版页是public partial class _Default : System.Web.UI.MasterPage,那么TypeName 就是_Default
    • @Ortund 是的,这是正确的。但我可能会建议您将其重命名为 DefaultMasterPage 之类的名称,以免造成混淆。
    【解决方案2】:

    您可以使用这种结构访问母版页中的任何公共方法:

    在 page.aspx 中:

    if (Page.Master != null)
                         ((YourMasterPageType)Page.Master).SetError("your error txt");
    

    在您的母版页中:

    public void SetError(string errMsg)
            {
                ErrCtrl.Visible = true;
                ErrCtrl.Text(errMsg);
            }
    

    【讨论】:

    • 无法访问属性,但我确实这样做了...Label lblErrorTitle = (Label)Page.Master.FindControl("lblErrorTitle"); lblErrorTitle.Text = "Update User"; ...等等
    • 我建议您在母版页代码中创建一个公共方法,例如 SetError 示例。这样,如果您的母版页控件发生更改,您就不必更改每个单独的页面。而且您必须将 Page.Master 转换为您的母版页类型。假设您的母版页称为“Site.Master”,然后您像这样调用函数: ((Site)Page.Master).SetError("your error txt");
    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多