c# - 我可以让两个 Web 用户控件 (.ascx) 共享同一个代码隐藏类吗?

标签 c# asp.net webusercontrol

我遇到这样一种情况,我需要为 Web 用户控件设置两个完全不同的布局,但控件的代码隐藏保持相同非常重要。

有什么方法可以为两个不同的 Web 用户控件使用相同的代码隐藏?我曾尝试更改 Page 指令以使用相同的类,但偶尔在构建时,会生成一个包含重复控件的 .designer.cs 文件,因此会出现编译错误。

我也试过从一个公共(public)基类继承,但是你看不到这个类的任何控件,这使得采用这种方法变得非常困难。

或者有没有办法阻止为“克隆”控件重新生成 designer.cs 类?

最佳答案

创建基类,并在那里实现通用逻辑。然后从这个基类继承控件。要从基类级别访问控件,请为您需要的每个控件在基类级别抽象获取属性。在子控件类中实现这些属性。

public abstract class BaseControl : UserControl
{
  public abstract TextBox FirstName { get; }

  public void SomeLogicExample() 
  {
    FirstName.Text = "Something"; 
  }
}

public class ControlA : BaseControl
{
  public override TextBox FirstName
  {
    // txtFirstNameA is ID of TextBox, so it is defined in ControlA.designer.cs
    get { return txtFirstNameA; }
  }
}

public class ControlB : BaseControl
{
  public override TextBox FirstName
  {
    // txtFirstNameB is ID of TextBox, so it is defined in ControlB.designer.cs
    get { return txtFirstNameB; }
  }
}

另外一种不太优雅的方法是在运行时定位控件;因为您需要为搜索整个控件树付费,并且您必须处理未找到控件的情况:

public abstract class BaseControl : UserControl
{
  public T GetControlByType<T>(Func<T, bool> predicate = null) where T : Control
  {
    var stack = new Stack<Control>(new Control[] { this });
    while (stack.Count > 0)
    {
      var control = stack.Pop();
      T match = control as T;
      if (match != null)
      {
        if (predicate == null || predicate(match))
        {
          return match;
        }
      }

      foreach (Control childControl in control.Controls)
      {
        stack.Push(childControl);
      }
    }

    return default(T);
  }    

  public TextBox FirstName
  {
    get { return GetControlByType<TextBox>(t => t.ID == "txtFirstName"); }
  }

  public void SomeLogicExample() 
  {
    FirstName.Text = "Something"; 
  }
}

关于c# - 我可以让两个 Web 用户控件 (.ascx) 共享同一个代码隐藏类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27798144/

相关文章:

asp.net - IE11 - 未将对象引用设置为 FreeTextBox.RenderTabs 中的对象实例

javascript - click() 触发多次

c# - 使用 JSON 序列化器反序列化 Mongodb 对象 ID

c# + WebForms + 静态——最佳实践是什么?

c# - 使用process.waitforexit()时线程被中止错误

c# - 无法从程序集 'mscorlib 加载类型 'System.Runtime.CompilerServices.ExtensionAttribute',版本 = 4.0.0.0 错误

asp.net - 我可以在 MVC 站点中使用 Asp.Net WebForm 用户控件吗?

asp.net - 如何只验证网页中的某些元素而不验证其他元素?

asp.net - 如何在aspx页面中隐藏ASP.NET自定义控件的属性?

c# - Activereports - 如何转到查看器中的特定页面?