ASP.NET:页面上的所有内容,还是进入控件?

ASP.NET:页面上的所有内容,还是进入控件?,asp.net,architecture,controls,Asp.net,Architecture,Controls,当你制作一个视觉上被分解成特定区域的页面时,你是将这些区域分解成控件,还是将页面上的所有内容都放在一个代码中 如果将区域划分为控件,您如何促进控件之间的通信?所谓通信,我的意思是简单地在服务器端交换数据 想象一个页面,在一个相当复杂的GridView上面有几个框。一个框指示GridView显示的内容,另一个框允许您使用GridView执行各种操作。两个盒子都需要与网格通信,但不能相互通信 这背后的代码至少有几千行 关于做出这些类型的设计决策的任何资源都会有所帮助 谢谢,控件应该公开事件,页面应该

当你制作一个视觉上被分解成特定区域的页面时,你是将这些区域分解成控件,还是将页面上的所有内容都放在一个代码中

如果将区域划分为控件,您如何促进控件之间的通信?所谓通信,我的意思是简单地在服务器端交换数据

想象一个页面,在一个相当复杂的GridView上面有几个框。一个框指示GridView显示的内容,另一个框允许您使用GridView执行各种操作。两个盒子都需要与网格通信,但不能相互通信

这背后的代码至少有几千行

关于做出这些类型的设计决策的任何资源都会有所帮助


谢谢,控件应该公开事件,页面应该处理相同的事件,并相应地更新网格视图


打破控制纯粹是出于需要。如果要重用,请将它们拆分为控件。如果它像一个废弃的项目,则不需要特定的控件。

对于我的第一个asp.net应用程序,我使用了分离到控件的方法。然而,我不再这样做了,我现在采取的方法是将所有内容都放在一个页面中。我只会在需要在多个页面上重复页面的相同部分和功能时使用控件。重用是控件真正的用途


如果要采用多控件方法,可以在控件上使用属性、方法和/或事件,以允许它们彼此通信或与页面上的控件通信。

Usercontrols有助于重用,顺便说一句,它们将功能分解为更小的部分,从而使代码库更易于管理。您也可以通过使用区域和其他组织技术,在一个整体页面上仔细规划代码来实现这一点

在过去我两者都做过,而且都能工作。我发现进行控件到页面通信的最佳方法是使用事件,即给定一个包含BoxA(网格显示)、BoxB(网格选项)和grid(包含gridview的用户控件)的页面,BoxA可以定义一个事件“DisplaySettingsChanged”,每当其设置发生更改时,它会在回发过程中抛出该事件。宿主页面将在不同组件之间创建事件订阅,例如捕获DisplaySettingsChanged和调用Grid.Refresh等


对于所有额外的基础设施,如果您确定不想在任何地方重复使用这些组件中的任何一个,我可能会将其放在一个整体页面中,特别注意保持所有内容的组织和可读性。

您可以采取两种方法-

路线1:从用户/干系人/管理层/UAT处获得批准,从页面中提取组件以实现更好的可管理性、重用等

路线2:从一开始就考虑可重用组件。测试组件/用户控件/自定义控件/web部件。在网页上混合和匹配您的组件,并发送以供批准

在大多数情况下,你在走路线1时应该不会有任何问题,特别是如果你的需求不断变化,而你没有太多时间的话。您将了解UI需求,并分析是否将页面分解为组件,组件是否需要直接相互通信或通过DB等进行通信

路线2是您确定是否有足够的需求表明某些UI/行为可以重用,是否需要独立测试等

有时直接跳到2号公路并不容易。如果你有领域经验,那当然

现在在ASP.net世界中,您甚至必须在自定义控件和用户控件之间进行选择。这是你可能不得不做出的另一个决定

希望这有帮助


快乐编码

使用用户控件有几个原因,例如:

  • 模块化代码:您可以将代码划分为多个用户控件,每个控件的代码更少,而不是一个臃肿的页面类。因此,如果您的页面有太多代码需要管理,将其拆分为用户控件可以减少每个类的大小
  • 重复使用:如果一个控件跨多个页面使用,或者在一个页面上有多个实例,那么构建一次然后重复使用它就容易多了。因此,如果您有在许多地方重复使用的通用UI组件,那么用户控件可以帮助您
当然要付出代价,每个控件都必须公开允许其父容器控制它的属性,并且必须公开事件以通知其父控件发生的事件。父控件也可以公开类似的事件和属性,但这会在用户控件中添加对父控件的依赖,这可能会使在其他容器中重复使用该控件变得复杂

如果您可以将页面的许多部分分解为明确定义了职责分离的逻辑组件,那么它们是用户控件的理想候选对象。这就像定义类时一样,有时一个类可能会变得太复杂,而您决定将其划分为几个较小的类,只是在这里,您定义的每个新类都会有较高的成本

根据我的经验,用户控件很棒,只是不要将控件分解到如此多的深度级别,以至于创建的复杂性比原来臃肿的页面更高。试着找到一个快乐的媒介,在那里控件做得足够多,而不是太多,并且你没有太多的控件

以下是一些关于用户控制通信的教程


如果要重用代码,我只会将其分成单独的控件。否则就是浪费时间。如果html在设计模式下不容易管理,我也会尝试创建服务器控件,比如动态生成面包屑或导航的代码。登录表单 ProxyNotifier / \ Control1 Control2
public static class ProxyNotifer
{
    // NOTE: This delegate should NOT be held in a static variable since
    // its session specific
    private static Action<string> NotifyEvent
    {
        get
        {
            if (!Session.ContainsKey["ProxyNotifyEvent"])
            {
                Session["ProxyNotifyEvent"] = null;
            }
            return Session["ProxyNotifyEvent"] as Action<string>;
        }
    }

    public static void Subscribe(Action<string> handler)
    {
        NotifyEvent += handler;
    }

    public static void Unsubscribe(Action<string> handler)
    {
        NotifyEvent -= handler;
    }

    public static void Invoke(string msg)
    {
        if (NotifyEvent != null) { NotifyEvent(msg); }
    }
}


public class Control1 : UserControl
{
    void SomethingHappened()
    {
        ProxyNotifyer.Invoke("Hello world!");
    }
}


public class Control2 : UserControl
{
    public Control2()
    {
        ProxyNotifer.Subscribe(Respond);
    }

    // ALWAYS unregister your event when your control is disposed, 
    // otherwise weirdness happens
    public void Dispose()
    {
        ProxyNotifier.Unsubscript(Respond);
        base.Dispose();
    }

    public void Respond(string msg)
    {
        lblMsg.Text = msg;
    }
}