【问题标题】:Best Practices for making user controls in asp.net?在 asp.net 中制作用户控件的最佳实践?
【发布时间】:2011-07-27 10:57:45
【问题描述】:

使用用户控件的最佳做法是什么?我的用户控件通常是在服务器上提交数据的表单,它们可以在页面中重用。

css 样式应该放在用户控件的什么地方?或在 aspx 页面中,这些样式应该在页面或外部 css 中?

类似的成功或失败消息通常是页面的一部分。但是在使用用户控件时,用户控件应该告诉页面关于结果或消息标签应该在控件内吗?

在使用用户控件时还有什么需要考虑的吗?

【问题讨论】:

    标签: asp.net .net-3.5


    【解决方案1】:

    首先,使用外部 css 文件进行样式设置通常被认为是最佳做法。通过这种方式,您可以在一个中心位置定义样式,因此它们可以在多个页面中重复使用,并且您可以修改样式而无需修改所有页面/控件。但是,如果您只有一个页面,您不妨将 CSS 代码放在页眉中。

    其次,如果您指的是表单验证,我会在您的用户控件中实现它。这样,如果您要大量重复使用控件,则无需每次都重写验证。

    如果您想将信息从页面传递到用户控件,您只需将适当的属性或方法公开或设为内部,即可将它们公开给页面。然而,从用户控件传递信息有点困难。一种方法是将页面中的委托传递给控件,​​或者在控件内部引发事件并让页面监听。无论哪种方式,让控件知道任何实现详细信息页面都被认为是不好的做法,因为这会阻止任何重复使用。

    因此,如果您想在主页上显示来自您的控件的错误消息,我会将此消息作为属性或通过页面可以侦听的事件公开。

    【讨论】:

    • 谢谢。但是如果在多个页面中使用外部 css 是很好的。如果它们仅在一页中使用,我看不到将它们放在外部的好处。关于第二点,我的意思是保存或编辑成功后,应向用户显示一条消息。这个标签应该在 UC 还是在 aspx 页面中,以及 UC 和 aspx 页面应该如何通信。
    • @user576510:我已经更新了我的答案以进一步回答您的问题
    【解决方案2】:
    1. 页面是控制器,它正在进行保存/编辑,因此它也应该有显示结果的标签。

    2. Page 和 UserControls 应该通过以下方式进行通信

      • 页面 -> UC 通过属性和函数
      • UC -> 页面通过Events

    这里有更多信息:http://www.codeproject.com/KB/user-controls/Page_UserControl.aspx#3

    【讨论】:

      【解决方案3】:

      类似的成功或失败消息通常是页面的一部分

      确实,在所有相关页面的同一位置出现错误消息是很常见的,可能是通过将其放在母版页上。

      一种常见的方法是为您的 UserControls 和 Pages 实现一个基类,该基类为常见的东西(例如错误消息的显示)实现管道。类似于以下粗略骨架:

      public class MyUserControlBase : UserControl
      {
          ...
          protected MyPageBase MyPageBase
          {
              get 
              { 
                  PageBase pageBase = Page as PageBase;
                  if (pageBase == null) throw new InvalidOperationException(
                          "This UC must be on a Page derived from MyPageBase");
                  return pageBase;
              }
          }
          ...
      }
      
      public class MyPageBase : Page
      {
          ...
          public void ShowError(string errorMessage)
          {
              MyMaster master = this.Master as MyMaster;
              if (master != null) master.ShowError(errorMessage);
          }
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多