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

母版页.net 4.0上的禁用按钮(c#),c#,.net,master-pages,C#,.net,Master Pages,当满足某些条件时,我试图从内容页禁用母版页上的按钮。 我可以使用会话变量更改母版页按钮上的文本,但我在使用最新的一位时遇到了一些问题-有人提示吗?我会向母版页添加一个公共方法来执行此操作,并让内容页调用它。这可以使事情变得更简单,更面向对象 您可以在内容页中使用MasterType指令来强式键入母版页。这将使调用方法更容易 <%@ MasterType virtualpath="~/Masters/Master1.master" %> 在母版页上,您将具有如下公共功能: publi

当满足某些条件时,我试图从内容页禁用母版页上的按钮。
我可以使用会话变量更改母版页按钮上的文本,但我在使用最新的一位时遇到了一些问题-有人提示吗?

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

您可以在内容页中使用
MasterType
指令来强式键入母版页。这将使调用方法更容易

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

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

public void EnableTheButton(Boolean enable) {
  btnTheButton.Enabled = enable;
}
在您的内容页上,您可以写:

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

这是很多人都会遇到的一个常见问题,有一种真正“简单”的方法可以解决。但是,如果您计划使此应用程序不断增长或变得非常复杂,那么采取简单的方法将对您造成伤害。其他大多数答案都会告诉你简单的方法让我们至少讨论一下正确的方法

首先,让我们弄清楚母版页和内容页之间的关系。内容页不应直接调用其母版上的特定于实现的成员,反之亦然。它们由页面主合同分隔。逻辑层面上发生了什么?内容页上发生的某些情况应导致特定按钮被禁用

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

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

如果你的应用程序很简单,那么这绝对是过火了。但是,随着您作为开发人员的成长,并开始构建更复杂的系统,这些都是您需要记住的事情,以使您的应用程序更简单、更稳定、更易于维护

这里有两个具体的,现实世界的事情,这个方法解决,来自我的经验

  • 这一点非常简单——如果您需要在运行时交换母版页,您需要完全解耦页面和母版页实现。一个母版页可能有另一个母版页没有的东西。我的一个具体例子有点极端——我们有几十个母版页嵌套到6层,在运行时交换它们。但是灵活性的原则仍然是一样的——看看这个网站上有多少关于如何在运行时更改母版页的问题

  • 这一个有点令人兴奋,但仍然有非常实际的后果。将逻辑职责划分为不同的类有一个非常重要的影响-它通常会减少应用程序中逻辑分支的总数(例如,
    if
    语句)。这些是bug的最大来源。如果一个类没有任何逻辑,那么它很难有bug当您开始以人年和开发人员的角度来考虑应用程序,并以几十万或数百万行代码来衡量时,在整个应用程序中聚合的逻辑分支越少,对稳定性和可变性的影响就越大。维护和增强更多地是安排简单、稳定的组件,而不是进行代码操作

  • 下面是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);
            }
        }
    }
    

    您是想在回发到服务器后在代码中这样做,还是想通过Javascript在客户机上这样做?这是ASP.NET还是ASP.NET MVC?除了迎合您的设计感之外,您能列举在母版页上调用方法的实际问题吗?我经常使用这种方法,它对我很有帮助。@Jonathan sure-我在答案中添加了两个。这很好,我知道这些东西有对也有错,但我只是从c开始,所以我在寻找一些简单的东西-这很适合我,谢谢