主页上的禁用按钮.net 4.0(c#)

时间:2011-05-04 16:22:39

标签: c# .net master-pages

我尝试在满足某些条件时从内容页面禁用母版页上的按钮。 我可以使用会话变量更改母版页按钮上的文本,但IM对这个最新位有点麻烦 - 任何暗示任何人?

3 个答案:

答案 0 :(得分:3)

我会在您的母版页中添加一个公共方法来执行此操作,并让内容页面调用它。这可以使事情变得更容易,更面向对象。

您可以使用内容页面中的MasterType指令强力键入母版页。这样可以更轻松地调用您的方法。

<%@ MasterType virtualpath="~/Masters/Master1.master" %>

答案 1 :(得分:3)

在您的母版页上,您将拥有如下公共功能:

public void EnableTheButton(Boolean enable) {
  btnTheButton.Enabled = enable;
}

在您的内容页面上,您会写:

((MyMasterType)this.Master).EnableTheButton(false);

答案 2 :(得分:1)

这是许多人提出的常见问题,并且有一种非常“简单”的方法可以使其发挥作用。但是,如果你计划这个应用程序在增长或者变得非常复杂,那么采取简单的方法将会对你造成伤害。大多数其他答案都会告诉你简单的方法。 让我们至少以正确的方式讨论

首先,让我们清楚主页和内容页之间的关系。内容页面不应直接在其主服务器上调用特定于实现的成员,反之亦然。它们由Page-Master合约分开。在逻辑层面发生了什么?内容页面上发生发生的事情会导致特定按钮被禁用。

现在,由于该按钮位于母版页上,因此它不应该知道特定的内容页面。所以它也不应该是按钮负责调用页面实例并检查标准,也不应该明确订阅类型特定的事件。

那该怎么办?应该有一些主数据对象(可能是单例)在整个请求生命周期中位于集中可用的位置。说,HttpContext.ItemsSession。作为主数据对象,它应该是单一权限,用于管理您正在谈论的这些条件。它应该在任何数据发生更改时引发事件,任何人(例如您的按钮)都可以订阅该事件并根据状态做出决策。 (以下示例)

如果你的应用程序简单愚蠢,那么这肯定是矫枉过正的。但随着您作为开发人员的成长,并开始构建更复杂的系统,您需要记住这些内容,以使您的应用程序更简单,更稳定,更易于维护。

根据我的经验,这是这种方法解决的两个具体的现实世界。

  1. 这个非常简单 - 如果您需要在运行时更换主页,您希望完全解耦页面和母版页实现。一个母版页可能有另一个没有的东西。我的一个特定情况有点极端 - 我们有几十个嵌入最多6层深的主页,在运行时交换进出。但灵活性原则保持不变 - 请看一下本网站有多少关于如何在运行时更改母版页的问题!

  2. 这个有点令人兴奋,但仍然有非常实际的后果。将逻辑职责分解为单独的类有一个非常重要的影响 - 它通常会减少应用程序中逻辑分支的总数(例如if语句)。这些是最大的错误来源。如果一个类没有任何逻辑,那么它很难有bug! :)当你开始考虑人工年和开发人员的应用程序,并在数十万或数百万行代码中进行测量时 - 在整个应用程序中聚合的逻辑分支越少,对稳定性产生实际的,可衡量的影响和可变性。与进行代码手术相比,维护和增强更多地是关于安排简单,稳定的组件。

  3. 以下是示例masterdata类:

    public class MasterData
    {
        private string _state1;
    
        public string State1
        {
            get { return _state1; }
            set
            {
                _state1 = value;
                OnDataChanged();
            }
        }
    
        private string _state2;
    
        public string State2
        {
            get { return _state2; }
            set
            {
                _state2 = value;
                OnDataChanged();
            }
        }
    
        public event EventHandler DataChanged;
    
        private void OnDataChanged()
        {
            if(this.DataChanged != null)
            {
                OnDataChanged(this, EventArgs.Empty);
            }
        }
    }