使用ASP.NET面板/多视图与单独页面的指南

使用ASP.NET面板/多视图与单独页面的指南,asp.net,Asp.net,通常需要创建一个UI来引导用户完成一个多步骤的过程。有两种常见的设计可以使用。一种选择是将每个步骤都设置为单独的页面。另一个选项是使用asp:panels或multiview控件,并将所有代码保留在一个asp.net页面中 每当我使用分离页面的方法时,我发现页面之间的数据共享是困难的 每当我使用多视图方法时,我发现逻辑背后的代码会失去内聚性。它一次处理的项目太多,很难理解 在决定使用哪种方法时,您使用什么标准 是否有其他设计模式可以帮助克服我在现有选项中发现的限制?请注意,这不是一个完整的解决方

通常需要创建一个UI来引导用户完成一个多步骤的过程。有两种常见的设计可以使用。一种选择是将每个步骤都设置为单独的页面。另一个选项是使用asp:panels或multiview控件,并将所有代码保留在一个asp.net页面中

每当我使用分离页面的方法时,我发现页面之间的数据共享是困难的

每当我使用多视图方法时,我发现逻辑背后的代码会失去内聚性。它一次处理的项目太多,很难理解

在决定使用哪种方法时,您使用什么标准


是否有其他设计模式可以帮助克服我在现有选项中发现的限制?

请注意,这不是一个完整的解决方案,但是,您在asp.net中也有此选项

我不喜欢webforms中的跨页回发,我同意当使用多视图时,您的标记和代码隐藏会很快失控


也许明智的折衷方案是多视图,但每个步骤都封装为单独的用户控件。这样,您就不必反对回发模式,并且仍然可以获得合理程度的代码分离。

在经典的ASP.NET WebForms中,我发现为每个页面使用面板是最好的选择。我只是假设您也在使用母版页

为了使面板的处理保持简单(从用户的角度来看页面),我使用了如下方法:

void ShowPanel(Panel panel)
{
    firstPagePanel.Visible = false;
    secondPagePanel.Visible = false;
    ...
    lastPagePanel.Visible = false;

    panel.Visible = true;
}
调用它意味着一次只能看到一个面板,所以我只是将每个面板视为一个单独的页面。如果需要,可以在页面面板中使用,只需将它们排除在ShowPanel方法之外即可

代码隐藏逻辑一次只处理一个事件处理程序(如按钮单击、下拉更改或其他)。我在这些处理程序中做的第一件事是
ShowPanel(theRightPanel)确保所有其他面板都已消失,并且与我想要的操作相关的面板(如显示流程的下一页)正在显示。如果最后一个事件要移动到新页面,我将从事件处理程序中填充该页面的数据。如果需要,您甚至可以在此处连接特定于页面的事件处理程序

我倾向于自己不使用ViewState(禁用它),并且我尽量避免引用面板上没有为我正在处理的处理程序显示的控件。我更喜欢在会话变量中传递任何数据,甚至通过当前表单中的隐藏输入传递数据,并在下一个表单中将其作为回发值处理。您可以将隐藏的输入动态添加到表单中,这样它们就不必出现在静态标记中。这有助于我更好地封装功能,并与web上实际发生的事情保持更紧密的联系

基本上,我只是将事件处理程序视为页面中的帖子

最后,使用分部类,您甚至可以将代码分解为块,其中每个页面(或面板)的代码都位于它自己的文件中。这确实避免了一个巨大的代码文件,在那里很难看到什么起作用。对于.ASPX页面,除了至少每个“页面”都在一个“元素”中这一事实之外,您可以做的不多。如果你有很多面板,它会变大。至少关闭ViewState可以防止它变得庞大

Page_Load方法所做的一切就是设置多页进程的第一页。以下每个页面都有自己的事件处理程序来触发它。我在OnInit中创建了事件处理程序(我通常也在这里禁用ViewState)


我还尝试将代码隐藏在ASPX页面之外,并真正使用代码隐藏。这是ASP.NETMVC仍然让我闻到的味道之一。此外,您可以做很多事情来保持代码的模块化,并允许可测试性等。不过,这有点超出了你的问题。

代码隐藏不一定会失控。如果您使用的是分部类,您可以轻松地将不同视图的代码分解为不同的文件。如果是,您还可以使用相同的参数来使用#区域块而不是分部。当然,这取决于个人偏好,但我会考虑用任何一种方法来组织一个大班级,作为一种可能的气味。