是否有一种普遍接受的方法可以在验证后将数据从一个 ASP.Net 形式传递到另一个表单
本文关键字:Net ASP 一个 数据 另一个 表单 一种 是否 验证 方法 | 更新日期: 2023-09-27 17:56:45
我有一个 ASP.Net 表单(Page1),用户在其中输入一些数据,然后单击提交按钮。
作为Page1的一部分,我有一些验证器,包括一个需要在服务器上进行验证的自定义验证器。
当用户单击提交按钮时,将发布到Page1,并且验证例程在服务器上运行,只要我在按钮单击例程中检查Page.IsValid,表单就知道事情是否已通过。
当验证未正确通过时,将返回到 Form1 并显示错误消息。
当表单通过验证时,我想将用户输入的数据传递给第二个表单 (Page2),以便可以根据用户在 Page1 上输入的数据正确呈现 Page2。
是否有一种普遍接受的方法或最佳方法将数据传递到 Page2? 以下是我所知道的一些方法:
- 使用查询字符串调用 Page2:这不起作用,因为在某些情况下我需要数据对用户不可见。
- 使用提交按钮上的 PostBackUrl 转到 Page2:据我所知,这无法正常工作,因为这样 Page1 的服务器端验证例程将无法运行。
- 使用会话变量:我不知道为什么这会很糟糕的特定原因。
- 使用Server.Transfer:我真的没有任何经验。
我认为这将是一件非常标准的事情,但我很难找到有关正确方法的任何信息。
如果您没有用于此数据的辅助存储形式,则使用Session
存储或Server.Transfer
都可以。
您可能会发现Server.Transfer
更整洁,因为这样,您将在整个传输过程中保留 POST 值。这可能会为您节省大量繁琐的会话状态代码,这取决于您的表单的复杂程度,这可能会为您必须预测并计划提前处理的各种异常行为开辟道路,例如当用户单击"后退"按钮时会发生什么,或者 - 如果您在多个页面上发布 - 会话过期时会发生什么(加上 Servy 的多个示例选项卡在同一页面上打开,所有选项卡共享同一会话)。使用会话状态可能会很混乱。
然后,如果Page.IsValid
,请对回发执行验证,请执行以下操作:
Server.Transfer("/FormPage2.aspx");
Server.Transfer
保留了Request.QueryString
和Request.Form
,因此您可以在FormPage2
上获取POST值,并在此处对它们执行任何需要的操作-无论是将它们用于条件逻辑还是将它们再次呈现为隐藏字段以将它们与表单第二页的值连接起来(请记住,如果您这样做,则必须在此阶段重新验证隐藏的输入)。
http://msdn.microsoft.com/en-us/library/y4k58xk7.aspx
我过去曾使用会话状态来处理复杂的表单,并发现自己希望我使用Server.Transfer
,我计划将来将其用于所有类似的工作,除非我有很好的理由不这样做。
您也可以考虑使用多视图,但根据我的经验,这些视图可能非常混乱。
希望这有帮助。
我认为最简单的解决方案是指定一个 PreviousPageType 指令。它指定页面应期望接收的类型,您将对该页面执行正常的 POST。
在应用程序的第二页上,使用以下指令:
<%@ PreviousPageType VirtualPath="~/FirstPage.aspx" %>
您将能够访问公开的属性,并使用如下所示的内容检查有效性:
if (PreviousPage != null && PreviousPage.IsValid)
使用 Session
对象是跨窗体传递信息的标准方法。
@Servy很好地解释了(在下面的评论中)Server.Transfer 在这种情况下如何为您提供帮助。
你说的其他选项都有问题,就像你提到的......
如果要使用会话:
在 Page1 的回发中,您可以设置以下值:
Session["myVar"] = <Data you want to pass to page2>
在 OnLoad 的第 2 页中:
if (Session["myVar"] != null)
{
myVar = Session["MyVar"]
}
您可以通过向页面添加属性来实现Server.Transfer1。例如,在page_load的第二个页面中:
Page1 prev = Page.PreviousPage as Page1;
if (prev != null)
{
// access your property here and set up the page
}
Server.Transfer
可以安全地接收查询字符串,而不必担心用户看到它。
而不是Session
使用Context.Items
.
Context.Items["validationProblems"] = "...";
Server.Transfer("FixProblems.aspx");
我的另一个评论是,根据我的经验,将验证 UI 包含在收集信息的相同表单中更为"标准"。 这样可以实现"实时"反馈。 在实践中,我认为最好尽早向用户提供他们做错了什么的信息。
注意,这只是我的经验......这是一个很大的世界。
它可能比您目前需要的更多,但一种替代方法是将数据保存在数据库中:
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