维护列表<>在ASP.Net中跨越页面边界的状态

时间:2009-03-12 19:08:06

标签: c# asp.net

我有一个ASP.NET WebForms应用程序,它具有要求用户以多个步骤提供数据的功能。目前,这是使用多个页面实现的。因此,用户访问step1.aspx,提供一些信息,然后重定向到step2.aspx以提供其他信息。

作为此过程的一部分操纵的对象存储在通用List<>中。宾语。我目前正在存储此列表<>在Session变量中,以便在页面之间维护对象的状态。完成该过程后,数据将发送到另一个应用程序公开的Web服务api。我不想在帖子之间的数据库中维护这些数据的状态,而是希望将其保留在内存中,直到它被提交到Web服务。

我正在将这个逻辑从Web应用程序中提取到它自己的类库中,因此我们可以从Windows应用程序中使用相同的库。

在将业务逻辑提取到自包含类库后,在帖子之间维护此数据的最佳做法是什么?

4 个答案:

答案 0 :(得分:2)

如果您想让库负责管理它自己的状态,您可以使用IoC模式并注入一个将处理数据状态的类。例如,想象一下:

class MyWizardLogic
{
 public void DoStep1()
 {
 }
}

现在我们可以定义一个新接口,将其称为StateProvider,因为它提供了状态:

interface IStateProvider
{ 
   List<WizState> CurrentState{get;set;}
}

现在您需要做的是告诉MyWizardLogic使用IStateProvider,如果您想使用DI框架,那么有很多选择,但让我们保持这个简单。您可以创建一个SessionStateProvider类,它将List存储到会话中。您可以创建第二个WinFormsStateProvider类,它将List存储在静态变量或其他适当的位置。

我会在各自的项目中创建这些类。这些类不应该是BL库的一部分。

现在,您可以修改DoStep1()方法以获取IStateProvider的参数。这将让您的web或winform应用程序指定要使用的IStateProvider。另外,您可以通过属性或构造函数设置它。我更喜欢使用构造函数。

现在,您的所有设置都将为您的客户控制BL依赖性。这也应该有助于简化测试。例如,您可以编写一个模拟状态提供程序来验证它是否被正确调用。

答案 1 :(得分:1)

使用ASP.NET,您有几个选择。您可以将其存储在会话状态,但由于同一会话中有多个浏览器窗口,这很快就会成为一个问题。

将一页上的数据输入从页面传递到另一页。

您可以对查询字符串中的数据进行编码并将其附加到URL,但是根据数据的大小,这可能会变得非常冗长且难以处理。

留下发布数据。您可以从第一个表单开始,然后将其发布到第二个表单。第二种形式在隐藏字段中对来自第一种形式的数据进行编码,然后将其数据和隐藏的字段数据传递给下一种形式等等。

然后,在最后一个表单(处理所有内容)之后的页面上,您拥有单独步骤的所有数据。

答案 2 :(得分:0)

我建议您将业务逻辑分为两类,一类用于Web表单,另一类用于Windows表单。你已经编写了标准的会话代码,为什么要浪费它?

如果你的心脏只设置了一个类,我想你会检查调用它的对象类型来定义你的逻辑。

答案 3 :(得分:0)

您可以将多个步骤放在一个页面中,并使用ASP:MultiView来管理各个步骤。事实上,MultiView有一个名为asp:WizardStep的模板类型。这样,您可以在ViewState页面中的步骤之间维护状态,并消除对Session变量的需要。

MSDN有一些很好的信息和示例here