0

我有一个 Form.aspx 页面。在 Post-Back 时,会发生复杂的验证。如果发现错误:

lblErrors.Text = "There are Errors"

您解决页面上列出的所有错误并点击提交。由于 Post-Back 验证没有发现错误:

lblErrors.Text = ""
Response.Redirect("Confirm.aspx")

在 Confirm.aspx 上,可以查看提交的数据。我有一个“返回编辑”按钮

您单击按钮返回并编辑某些内容,然后什么!?... lblErrors.Text 显示“有错误”。我意识到 Go Back 功能会拉出一个缓存页面,但我希望由于我在 Form Post-Back 期间将 Text 更改为“”,回来时它会是空的。不是。

简而言之,我希望用户能够回发前一页及其所有视图状态的荣耀。那时我将处理 Page_Load 中的 lblErrors。

有很多字段,其中许多是 Web 服务数据源下拉列表,其中每个选择都依赖于之前的选择。重新运行并检查为会话变量会很糟糕。因此,将每个字段的值保存到变量并进行定期重定向并不是我希望的答案。我期待一些我没有意识到的关于 PreviousPage 的东西。

4

2 回答 2

0

您可以考虑使用这种方法进行跨页发布: http: //msdn.microsoft.com/en-us/library/ms178139 (v=vs.100).aspx

像这样的东西:

if (Page.PreviousPage != null)
{
    Label lblError = 
        (Label)Page.PreviousPage.FindControl("lblError");
    if (lblError != null)
    {
        lblError.Text = "There are Errors";
    }
}
于 2013-05-03T20:34:57.397 回答
0

这违背了所有逻辑,但我目前不想弄清楚发生了什么。

在我的 Page_Load 中,我这样做了:

    Try
        Dim strValidation As String = String.Empty
        Dim PostbackType As String = String.Empty

        If Session("Submit") IsNot Nothing Then
            If Session("Submit").ToString = "Submit" Then
                PostbackType = "Submit"
            Else
                PostbackType = "Back"
            End If
            Session("Submit") = Nothing
        End If

        If PostbackType = "Submit" Then
            Session("Submit") = "Back"
            Response.Redirect("Confirm.aspx")
        End If

        If IsPostBack AndAlso PostbackType <> "Back" Then
            If Request.Form("__EVENTTARGET").ToString.Contains("btnSubmit") Then
                strValidation = ValidateForm()
                If strValidation.Length > 0 Then
                    lblErrors.Text = strValidation
                Else
                    lblErrors.Text = ""
                    Session("Submit") = "Submit" 'Set so the page fully loads into the user's cache, then re-submits for the real submit
                    Dim jsLink As New HtmlGenericControl("script")
                    jsLink.InnerHtml = "javascript:__doPostBack('btnSearch','')"
                    jsLink.Attributes.Add("type", "text/javascript")
                    Me.Controls.Add(jsLink)
                End If
            End If
        End If
    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)
    End Try

简而言之,我让页面在验证后实际加载到他们的缓存中,然后再次立即回发,这是为了真正的提交。

总而言之,我将重定向从表示表单已验证的条件中取出。因此,即使经过验证,页面也会完全加载(从而进入用户的缓存)。但相反,我在页面末尾添加了一个 Javascript,它会自动进行回发,所以用户看到的只是眨眼。在那个回发中,我的会话变量说,kthx,继续提交给我。所以从技术上讲,他们的浏览器看到的最后一页是干净的。

不过,我仍然想听听是否有真正的答案。此解决方法要求在用户的 PC 上启用 Javascript,并创建“闪烁”。

关键是……当用户现在“返回”时,jsLink 脚本控件仍在页面中……虽然页面是缓存的,但它会运行并执行回发。所以有了这个,后退按钮实际上确实在技术上触发了我的 page_load(如果这是真的,我会通过跳过我的 Page_Load 回发内容来处理)。但是知道这并不能帮助我清理代码。我只想出于美学原因使用 JavaScript,而不是依赖它来实现功能。

于 2013-05-03T21:51:36.653 回答