【问题标题】:Set codebehind public property directly from ascx直接从 ascx 设置代码隐藏公共属性
【发布时间】:2011-07-26 12:22:18
【问题描述】:

我有三个用户控件:usercontrolA、usercontrolB 和 usercontrolC,它们都共享相同的代码隐藏,每个控件都有:

<%@ Control Language="c#" AutoEventWireup="True" Codebehind="usercontrolA.ascx.cs" Inherits="usercontrolA" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> 在 ascx 的顶部。

在代码隐藏文件中,我有一个名为 ShowAll 的公共属性。

我知道我可以在将用户控件放在页面上时设置此属性,例如

<uc1:usercontrolB ID="usercontrolB1" runat="server" ShowAll="true" />

但是我希望在 usercontrolB 上 ShowAll 始终设置为 true,因此不必在每次将其放置在页面上时都设置它。

我知道我可以在 usercontrolB 中添加一个脚本标签来设置 Page_Load 中的 ShowAll:

<script runat="server">
    protected void Page_Load(object sender, System.EventArgs e)
    {
        ShowAll = true;
    }
</script>

但想保留我在代码隐藏中已有的Page_Load 实现。 还有其他方法可以自动为 usercontrolB 设置此属性吗?

编辑:如果可能的话,我希望能够在 ascx 中而不是在后面的代码中设置它,以便以后其他人可以添加 usercontrolD 并设置 @987654331对于usercontrolD 的所有实例,@ 为 true,而无需让我修改和重新编译代码隐藏。

【问题讨论】:

  • 为什么要共享代码隐藏?
  • @Arief,这是面向对象编程的主要原则之一。
  • @Arief 避免为本质上相同的控件复制大量代码,但 html 标记的变化
  • 我的意思是如果你有不同的行为,为什么你首先要共享相同的代码?不能用继承吗?抄送@Kon
  • 您遇到的问题类型应该引起注意。也许是时候备份和重构您的设计了。看起来这确实是继承而不是直接代码共享的候选。

标签: c# asp.net user-controls


【解决方案1】:

你必须在 usercontrol 类的构造函数中设置它。

public ConstructorClassName()
    {
       ShowAll = true;
    }

这里是完整的示例代码...

public partial class WebUserControl : System.Web.UI.UserControl
{
  public WebUserControl()
  {
    ShowAll = true;
  }
  private bool _showAll;
  public bool ShowAll
  {
    get { return _showAll; }
    set { _showAll = value; }
  }   

  protected void Page_Load(object sender, EventArgs e)
  {
  }
}

我将默认值设置为 true,但您也可以将添加此用户控件的值传递给该值。例如

<uc1:usercontrolB ID="usercontrolB1" runat="server" ShowAll="false" />

当这个被调用时,它会将值覆盖到false

【讨论】:

  • 鉴于所有三个共享相同的代码,我如何才能为 usercontrolB 设置属性?
  • 当然——但问题是有什么方法可以做到这一点,而不必每次将用户控件放在页面上时都这样做?答案很可能是不可能的!
  • 你能解释一下吗,我没听懂你的意思。你到底想要什么?
  • 有没有办法从 ascx 页面本身设置代码隐藏属性,例如也许在我的示例中的脚本标记中(但没有隐藏代码隐藏的 page_load)?
  • 这是从aspx页面设置的,它将后面的代码设置为true。你可以测试吗?
【解决方案2】:

在你后面的代码中你可以检查实例类型:

protected void Page_Load(object sender, System.EventArgs e)
{
    if (this is usercontrolB) 
    {
         ShowAll = true;
    }
}

【讨论】:

  • 但是由于它们共享相同的代码隐藏,我没有 usercontrolB 类,所以我肯定无法检查是否(这是 usercontrolB)?
  • 根据您的示例代码:&lt;uc1:usercontrolB .../&gt;,您定义了一个 usercontrolB 类。 (this is usercontrolB) 正在检查类型,而不是用户控件的名称。
  • 是的 - 我没有定义 usercontrolB 类,尽管我的 aspx 页面顶部只有 &lt;%@ Register src="usercontrols/usercontrolB.ascx" tagname="usercontrolB" tagprefix="uc1" %&gt;,它允许我像我一样引用 usercontrol。我有三个用户控件,它们的代码隐藏都具有 usercontrolA.ascx.cs,并且都继承了 usercontrolA
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多