0

这可能是一个基本问题......但是我只是选择了一个解决方案而没有给予太多考虑......

考虑一个带有表格网格的页面:/FormList.aspx

选择编辑表单会将用户重定向到如下页面:/FormEdit.aspx?Id=2

我通常可以在查询字符串中传递值,因为我在 FormEdit 的代码隐藏中检查了 Id 是否有效。但是,传递值的最佳方式是:会话还是查询字符串?或其他?

当用户正在编辑表单时......我通常在会话中临时保存 Id(以避免再次从 url 获取它)。在用户表单编辑期间,存储值的最佳方式是什么?在会话中还是在隐藏字段中 ?或其他?(当我想存储一个临时的DataTable时,我相信我只能使用会话,但是当它是一个整数值时......)

提前感谢您的建议:)

4

5 回答 5

3

我建议不要使用Session可以在查询字符串或隐藏表单字段中轻松快速地存储和检查的东西;您似乎在这里谈论的信息非常适合查询字符串。

请注意,Session当有人尝试在不同的选项卡中一次编辑多个表单时,可能会引入错误。当他们保存一个时,所Session取的值将来自他们加载的最后一个保存...可能不是您想要的,而且可能很难弄清楚这一点。

您应该做的是在查询字符串/表单字段中保留 formID,并在提交保存时仔细检查它的完整性;例如,确保它是一个存在的 ID,并且允许他们进行编辑。

于 2010-11-19T11:08:17.000 回答
1

如果要在页面之间传输的数据非常少,通常 QueryString 是一个不错的选择。

2- 当您想存储用户特定的数据时,会话将是一个很好的选择。

在您的情况下,最好是查询字符串,因为您将非常小的数据(ID)发送到下一页。

于 2010-11-19T11:05:42.337 回答
1

有几点需要考虑:

  1. 如果对值的操作存在安全风险,则需要将其保存在服务器端,或者保护值客户端(这不容易得到正确)。甚至更好:重新计算它们。
  2. 如果用户同时在多个选项卡中打开网站,则在会话中保存很容易产生问题。它还可以破坏后退按钮。
    例如,如果您保护了用户当前在会话中编辑的项目的 ID,并且用户同时编辑了两个条目,则他首先开始编辑的条目的内容可能会写入他稍后开始编辑的条目中。
于 2010-11-19T11:06:02.303 回答
0

我的建议是将值保留在会话变量中,但是当您第一次运行 FormEdit.aspx 的 page_load 时,将值保存在页面的 ViewState 中,并清除会话变量。

类似的东西(在 FormEdit.aspx 的 page_load 中):

if (!IsPostBack)
{
    ViewState["MyVar"] = Session["MyVar"];
    Session.Remove("MyVar");
}
于 2010-11-19T20:59:00.343 回答
0

ASP.NET 和查询字符串的问题在于它们在回发时仍然存在。也就是说,任何页面的表单操作默认为 url,包括用于加载它的查询字符串。

如果所讨论的 ID 仅用于选择特定形式(并且与用户数据无关),这没什么大不了的,实际上它可能正是您想要的。

另一方面,如果它标识了一条记录,您可能不希望这样做。假设您正确编码,这不应该带来安全风险,但它可以通过在查询字符串中公开记录的内部 ID 给用户一种印象,即存在安全风险。它也只是看起来很不幸。

有一些方法可以解决这个问题,我认为在 3.5 中您可以以编程方式更改表单操作。(过去你必须使用 javascript 来做到这一点 - 即使表单操作被暴露,它也无法更改)。

处理此问题的最佳方法是避免使用任何数据记录标识符的查询字符串。使用 POST 来加载数据记录,例如,不使用 asp:HyperLink 控件,而是使用 asp:LinkBut​​ton 控件。

当然,由于 POSTS 加载它们的来源相同的页面,这要求您的表单与列表位于同一页面上。因此,不要有两个单独的页面,FormList.aspxFormEdit.aspx只需将代码放在同一页面上,这样您就可以直接回帖。大概您的每个表单都在 UserControl 中。因此,您的主页只需要选择要显示的用户控件,其他所有内容都委托给用户控件,并且所有参数传递都可以通过主页内的帖子完成。这是一个更好的架构,可以让一切保持整洁。

于 2010-11-19T21:22:16.357 回答