1

我有一个 ASP.Net 表单 (Page1),用户在其中输入一些数据,然后单击提交按钮。

作为 Page1 的一部分,我有一些验证器,包括一个需要在服务器上进行验证的 CustomValidator。

当用户单击提交按钮时,将向 Page1 发布一个帖子,并且在服务器上运行验证例程,只要我在按钮单击例程中检查 Page.IsValid,表单就会知道事情是否已经通过。

当验证没有通过时,一切都正确返回到 Form1 并显示错误消息。

当表单通过验证时,我想将用户输入的数据传递给第二个表单(Page2),以便可以根据用户在 Page1 上输入的数据正确呈现 Page2。

是否有一种普遍接受的方式或最佳方式将数据传递给 Page2?以下是我知道的一些方法:

  • 使用查询字符串调用 Page2:这不起作用,因为在某些情况下我需要数据对用户不可见。
  • 使用提交按钮上的 PostBackUrl 转到 Page2:据我所知,这将无法正常工作,因为 Page1 的服务器端验证例程将不会运行。
  • 使用会话变量:我不知道这会不好的特定原因。
  • 使用 Server.Transfer:我对此没有任何经验。

我认为这将是一件非常标准的事情,但我很难找到有关正确方法的任何信息。

4

6 回答 6

1

使用Session对象是跨表单传递信息的标准方式。

@Servy 很好地解释了 Server.Transfer在这种情况下如何为您提供帮助(在下面的评论中)。

你说的其他选项都有问题,就像你提到的......

如果要使用 Session:
在 Page1 的回发中,您可以设置值:

Session["myVar"] = <Data you want to pass to page2>

在 OnLoad 的 page2 中:

if (Session["myVar"] != null)
{
   myVar = Session["MyVar"]
}
于 2013-01-29T20:44:33.417 回答
1

我认为最简单的解决方案是指定一个 PreviousPageType 指令。它指定页面应该期望接收的类型,并且您可以对该页面执行正常的 POST。

在应用程序的第二页上,使用以下指令:

<%@ PreviousPageType VirtualPath="~/FirstPage.aspx" %>

您将能够使用以下内容访问公开的属性并检查其有效性:

if (PreviousPage != null && PreviousPage.IsValid)
于 2013-01-29T20:47:59.383 回答
1

如果您没有此数据的辅助存储形式,则使用Session存储或Server.Transfer将工作。

您可能会发现Server.Transfer更简洁一些,因为这样,您将在传输过程中保留您的 POST 值。这可能会为您节省大量使用会话状态的繁琐代码,这取决于您的表单的复杂程度,可能会为您必须预测并计划提前处理的各种异常行为开辟道路例如当用户单击“返回”按钮时会发生什么,或者 - 如果您要跨多个页面发布 - 会话到期时会发生什么(加上 Servy 在同一页面上打开多个选项卡的示例,所有这些都共享同一会话)。使用会话状态可能会很混乱。

在 PostBack 上执行您的验证,如果是Page.IsValid,请执行以下操作:

Server.Transfer("/FormPage2.aspx");

Server.Transfer保留Request.QueryStringand Request.Form,因此您可以在此处获取您的 POST 值FormPage2并对其执行任何您需要的操作 - 无论是将它们用于条件逻辑还是将它们再次呈现为隐藏字段以将它们与第二页中的值连接起来表单(请记住,如果您这样做,则必须在此阶段重新验证隐藏的输入)。

http://msdn.microsoft.com/en-us/library/y4k58xk7.aspx

过去我曾使用会话状态来处理复杂的表单,并且发现自己希望使用Server.Transfer,我计划在未来将其用于所有类似的工作,除非我有充分的理由不这样做。

您也可以考虑使用multiview,但根据我的经验,这些可能非常混乱。

希望这可以帮助。

于 2013-01-29T20:51:08.993 回答
0

您可以使用 Server.Transfer 通过向 page1 添加属性来实现此目的。例如,在 page_load 的第二页中:

Page1 prev = Page.PreviousPage as Page1;
if (prev != null)
{
    // access your property here and set up the page
}
于 2013-01-29T20:52:22.020 回答
0

Server.Transfer可以安全地接收查询字符串,而不必担心用户看到它。

而不是Session使用Context.Items.

Context.Items["validationProblems"] = "...";
Server.Transfer("FixProblems.aspx");

我的另一条评论是,根据我的经验,将验证 UI 包含在收集信息的同一表单中更为“标准”。这实现了“实时”反馈。在实践中,我认为最好尽早向用户提供他们做错了什么的信息。

请注意,这只是我的经验……这是一个很大的世界。

于 2013-01-29T21:03:57.643 回答
0

您目前需要的可能更多,但另一种方法是将数据保存在数据库中:

http://msdn.microsoft.com/en-us/library/6tc47t75%28v=VS.100%29.aspx

http://www.asp.net/web-forms/videos/how-do-i/how-do-i-set-up-the-sql-membership-provider

于 2013-01-29T21:35:00.337 回答