通常需要创建一个用户界面来引导用户完成多步骤过程。人们可以使用两种常见的设计。一种选择是使每个步骤成为单独的页面。另一个选择是使用asp:面板或多视图控件,并将所有代码保存在一个asp.net页面中。
每当我使用单独的页面方法时,我发现页面之间的数据共享是kludgy。
每当我使用多视图方法时,我发现代码隐藏逻辑会失去凝聚力。它一次处理的项目太多而且难以理解。
在决定使用哪种方法时,您使用什么标准?
是否有其他设计模式可以帮助我在现有选项中找到的限制?
答案 0 :(得分:6)
我不喜欢webforms中的跨页回发,并且同意在使用MultiView时,你的标记和代码隐藏很快就会失控。
可能一个合理的折衷方案是MultiView,但每个步骤都封装为一个单独的用户控件。这样你就不必与postback模型作斗争,并且仍然可以获得合理程度的代码分离。
答案 1 :(得分:0)
不是一个完整的解决方案,但是,您在asp.net中也有Wizard选项。
答案 2 :(得分:0)
在经典的ASP.NET WebForms中,我发现每个页面使用一个面板是最佳选择。我只是假设您正在使用母版页。
为了简化面板的处理(从用户的角度来看),我使用这样的东西:
void ShowPanel(Panel panel)
{
firstPagePanel.Visible = false;
secondPagePanel.Visible = false;
...
lastPagePanel.Visible = false;
panel.Visible = true;
}
调用这意味着一次只能看到一个面板,所以我只是将每个面板视为一个单独的页面。如果需要,可以使用页内面板,只是将它们放在ShowPanel方法之外。
代码隐藏逻辑一次只处理一个事件处理程序(如按钮单击,下拉更改或其他)。我在每个处理程序中做的第一件事是ShowPanel(theRightPanel);
,它确保所有其他面板都已消失,并且显示与我想要的操作相关的面板(如显示该过程的下一页) 。如果最后一个事件要移动到新页面,我将从事件处理程序中填充该页面的数据。如果需要,您甚至可以在此处连接页面特定的事件处理程序。
我倾向于不自己使用ViewState(禁用它),我试图避免引用未显示我正在处理的处理程序的面板上的控件。我更喜欢在Session变量中传递任何数据,甚至通过当前表单中的隐藏输入传递它,并在下一个中将它们作为回发值处理。您可以动态地向表单添加隐藏的输入,这样它们就不必存在于静态标记中。这有助于我更好地封装功能,并与网络上实际发生的事情保持更紧密的联系。
基本上,我只是从页面处理POST之类的事件处理程序。
最后,对于部分类,您甚至可以将代码隐藏代码拆分为块,其中每个页面(或面板)的代码都在其自己的文件中。这真的避免了一个巨大的代码文件,很难看出它做了什么。除了事实上至少每个“页面”都在一个`元素中之外,你可以为.ASPX页面做的事情不多。如果你有很多面板,它会变大。至少关闭ViewState可以防止它大规模增长。
所有Page_Load方法都在设置多页面进程的第一页。以下每个页面都有自己的事件处理程序来触发它。我在OnInit中设置事件处理程序(我通常也禁用ViewState)。
我也真的试图将代码保留在ASPX页面本身之外并真正使用Code Behind。这是仍然让ASP.NET MVC闻到的东西之一。此外,您可以做很多事情来保持代码模块化并允许可测试性等。这有点超出你的问题。