我尝试在满足某些条件时从内容页面禁用母版页上的按钮。 我可以使用会话变量更改母版页按钮上的文本,但IM对这个最新位有点麻烦 - 任何暗示任何人?
答案 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.Items
或Session
。作为主数据对象,它应该是单一权限,用于管理您正在谈论的这些条件。它应该在任何数据发生更改时引发事件,任何人(例如您的按钮)都可以订阅该事件并根据状态做出决策。 (以下示例)
如果你的应用程序简单愚蠢,那么这肯定是矫枉过正的。但随着您作为开发人员的成长,并开始构建更复杂的系统,您需要记住这些内容,以使您的应用程序更简单,更稳定,更易于维护。
根据我的经验,这是这种方法解决的两个具体的现实世界。
这个非常简单 - 如果您需要在运行时更换主页,您希望完全解耦页面和母版页实现。一个母版页可能有另一个没有的东西。我的一个特定情况有点极端 - 我们有几十个嵌入最多6层深的主页,在运行时交换进出。但灵活性原则保持不变 - 请看一下本网站有多少关于如何在运行时更改母版页的问题!
这个有点令人兴奋,但仍然有非常实际的后果。将逻辑职责分解为单独的类有一个非常重要的影响 - 它通常会减少应用程序中逻辑分支的总数(例如if
语句)。这些是最大的错误来源。如果一个类没有任何逻辑,那么它很难有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);
}
}
}