暂时传递值和保存值,...使用会话,隐藏字段,查询字符串或其他?

时间:2010-11-19 11:01:10

标签: c# asp.net session query-string hidden-field

这可能是一个基本问题......但是我刚刚选择了一个解决方案而没有提供太多的解决方案......

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

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

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

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

提前感谢您的建议:)

5 个答案:

答案 0 :(得分:3)

我建议不要将Session用于可以在查询字符串或隐藏表单字段中轻松快速地存储和检查的内容;您在这里看到的信息对于查询字符串来说是完美的。

请注意,当有人尝试在不同标签中同时修改多个表单时,Session可能会引入错误。当他们保存一个时,Session值将来自他们加载的最后一个保存...可能不是你想要的,并且可能很难弄明白。

你应该做的是将formID保存在查询字符串/表单字段中,并在提交保存时仔细检查它是否合理;例如,确保它是一个存在的ID,并允许它们进行编辑。

答案 1 :(得分:1)

通常情况下,如果您的网页之间传输的数据非常少,则QueryString是一个不错的选择。

2-当您想存储用户特定数据时,会话将非常棒。

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

答案 2 :(得分:1)

需要考虑的一些事项:

  1. 如果操纵值是一种安全风险,您需要将其保存在服务器端,或者保护价值客户端(这不容易纠正)。甚至更好:重新计算它们。
  2. 如果用户同时在多个标签页中打开网站,则保存在会话中很容易产生问题。它也可以打破后退按钮 例如,如果您确保用户当前在会话中编辑的项目的ID,并且用户同时编辑了两个条目,则他开始编辑的项目的内容可能会被写入他稍后开始编辑的条目中。 / LI>

答案 3 :(得分:0)

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

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

if (!IsPostBack)
{
    ViewState["MyVar"] = Session["MyVar"];
    Session.Remove("MyVar");
}

答案 4 :(得分:0)

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

如果有问题的ID仅用于选择特定表单(并且与用户数据无关),这不是什么大问题,事实上它可能就是你想要的。

另一方面,如果它识别记录,您可能不希望这样。假设您正确编码,这不会带来安全风险,但它可以通过在查询字符串中公开记录的内部ID来给用户留下印象。它看起来也很不幸。

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

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

当然,由于POSTS加载的是同一页面,因此要求您的表单与列表位于同一页面上。因此,不要使用两个单独的页面FormList.aspxFormEdit.aspx,而只需将代码放在同一页面上,以便您可以直接回发。据推测,无论如何,每个表单都在UserControl中。因此,您的主页只需要选择要显示的用户控件,其他所有内容都委托给用户控件,所有参数传递都可以通过主页内的帖子完成。这是一个更好的架构,保持一切美观和干净。