【问题标题】:disable button on masterpage .net 4.0 (c#)禁用母版页上的按钮 .net 4.0 (c#)
【发布时间】:2011-05-05 00:59:20
【问题描述】:

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

【问题讨论】:

  • 您是在回发到服务器后尝试在后面的代码中执行此操作,还是尝试通过 Javascript 在客户端执行此操作?
  • 这是 ASP.NET 还是 ASP.NET MVC?

标签: c# .net master-pages


【解决方案1】:

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

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

在你的内容页面上你会写:

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

【讨论】:

  • 这很好用,我知道这些事情是有对错的,但我刚开始真正使用 c#,所以正在寻找简单的东西 - 这很适合我,谢谢
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    首先,让我们明确母版页和内容页之间的关系。内容页面不应直接调用其主节点上的特定于实现的成员,反之亦然。它们由 Page-Master 合约分开。在逻辑层面发生了什么?内容页面上正在发生,应该导致特定按钮被禁用。

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

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

    如果您的应用程序过于简单,那么这绝对是矫枉过正。但随着您成长为一名开发人员并开始构建更复杂的系统,您需要牢记这些事项,以使您的应用程序更简单、更稳定且更易于维护。

    根据我的经验,这种方法解决了两个具体的现实问题。

    1. 这非常简单 - 如果您需要在运行时更换母版页,您希望将您的页面和母版页实现完全分离。一个母版页可能有另一个没有的东西。我的一个具体案例有点极端——我们有几十个母版页,最多嵌套 6 层,在运行时交换它们。但灵活性原则保持不变 - 看看这个网站上有多少关于如何在运行时更改母版页的问题!

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

    这是示例主数据类:

    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);
            }
        }
    }
    

    【讨论】:

    • 除了吸引您的设计感之外,您能否列举在母版页上调用方法的实际问题?我已经多次使用这种方法,它对我很有帮助。
    • @Jonathan 当然 - 我在答案中添加了两个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2011-11-11
    • 2012-10-06
    相关资源
    最近更新 更多