【问题标题】:Are there ASP.NET Session design patterns?是否有 ASP.NET 会话设计模式?
【发布时间】:2011-06-30 23:19:49
【问题描述】:

有没有在 ASP 中构建会话存储的方法?我通常将字符串作为键,但我正在考虑采取更严格的措施。

问题出现是因为我有一个应用程序必须大量使用会话,原因有两个:

  1. 应用程序必须先对数据执行操作,然后才能将其呈现给用户。
  2. 应用程序必须在写入更改之前验证一些选择。

我的策略是构建列表并将它们存储在页面加载的会话中。

我遇到了几个问题。我不断收到有关“为用户输入”内容的报告,即我在会话中构建和存储的列表之一显示了在他们有机会添加之前输入的值。鉴于我在每次加载时都重建了存储在会话中的列表,我不确定为什么会继续发生这种情况。我怀疑有很多返回按钮。

有没有办法设计会话存储,以便存储的列表对于该页面实例是唯一的?或者,如果做不到这一点,可以设计一种会话存储方式,使其始终对该页面唯一?

【问题讨论】:

  • "我不断收到有关“为用户输入”和其他内容的报告。" - 关心扩展?
  • 编辑了问题以获取更多详细信息。
  • 数据是否只在一个页面请求中使用——这意味着页面加载完成后不需要保留它?从您下面的评论来看,您似乎只需要在绑定列表视图时保留一组查找值。
  • 如果你在每次加载时都重建列表......为什么你甚至需要将它存储在会话中??

标签: asp.net session


【解决方案1】:

通常,您将会话用于可在页面之间共享且特定于用户的数据。

您所描述的不是很好地使用会话。考虑一下如果用户碰巧在不同的标签中打开了两个页面会发生什么——第二个标签中的会话数据将覆盖第一个标签中的数据,并且您正在走向数据损坏。

在将数据呈现给用户之前对其进行操作并没有错,这通常在您的业务层中执行。如果操作的计算量很大,请考虑某种缓存策略。

正如@mikek3332002 所说,使用内置验证工具。同样,很少有理由将会话用作验证的一部分。

【讨论】:

  • 我真的不喜欢 ASP 验证器。老实说,它们带来的麻烦远多于它们的价值。我可以编写一个 javascript 验证器,而不是修复所有这些验证器附带的东西。
  • 我看到了关于会话的要点......我不完全将它用于验证。这是一个示例:我们有一个连接表和一个查找表。我需要我的列表视图绑定到引用表,但仅限于连接表中的那些引用值。所以在页面加载时,我查找连接表,构建相关参考值列表并将其存储在会话中。然后我绑定到我的列表视图。
【解决方案2】:

有一个名为viewstate 的功能可以在客户端页面上保存每页的回发数据。


编辑后

根据 cmets,听起来您更想要返回在 2 个表之间共享键的行(SQL 的 inner join),或者使一个控件的值取决于另一个控件的属性。

第二个用like(改编自http://msdn.microsoft.com/en-us/magazine/cc163862.aspx

public DataSet GetData(int ID) { ... }


<asp:ObjectDataSource ID="odsDataSource" runat="server" TypeName="DataDepend" SelectMethod="GetData">
    <SelectParameters>
        <asp:ControlParameter Name="ID" Type="int" 
        ControlID="ddlList1"
        PropertyName="SelectedValue"></asp:ControlParameter>
    </SelectParameters>
</asp:ObjectDataSource>

【讨论】:

  • 如果你专注于 ViewState(这是一个合理的选择,取决于对他的问题的更多澄清),你的答案会更好,并摆脱关于验证器的东西(他没有问并且与他的问题无关)。
  • 他确实使用了“验证”这个词,你是对的。诚然,第 2 点相当模糊,但如果您阅读整个问题,您会发现它与验证器所做的验证客户端输入无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
相关资源
最近更新 更多