关于跨页提交与验证控件的问题
2007-07-27 01:02 晓风残月 阅读(1023) 评论(0) 收藏 举报
问题来源
 a.aspx是一个注册页面.它上面有一个检测用户名格式的正则表达式控件(RegularExpressionValidator),一个检测用户名是否存在的用户自定义控件(CustomValidator). 正则表达式控件的客户端验证是关闭的,如果注册成功后就提交到b.aspx,我把一个服务器按钮的PostBackUrl="~/b.aspx"
a.aspx是一个注册页面.它上面有一个检测用户名格式的正则表达式控件(RegularExpressionValidator),一个检测用户名是否存在的用户自定义控件(CustomValidator). 正则表达式控件的客户端验证是关闭的,如果注册成功后就提交到b.aspx,我把一个服务器按钮的PostBackUrl="~/b.aspx"
 但出现问题了:当用户名不合法或者用户已经存在的情况下,还是提交到b.aspx,这就不符合我的要求了.
但出现问题了:当用户名不合法或者用户已经存在的情况下,还是提交到b.aspx,这就不符合我的要求了.
 如果我去掉PostBackUrl="~/b.aspx",让a.aspx提交到自身的页面,一切正常
如果我去掉PostBackUrl="~/b.aspx",让a.aspx提交到自身的页面,一切正常
 请教高手,给点指教!!!
http://community.csdn.net/Expert/TopicView3.asp?id=5677458
请教高手,给点指教!!!
http://community.csdn.net/Expert/TopicView3.asp?id=5677458
也就是说,如果通过 A 执行跨页提交到 B,并且禁用A页面上的验证控件的客户端验证功能,当验证失败之后,依然执行提交到 B。
由于想出不来,当 PageA.IsValid = false 的时候,如何取消跨页提交定向到B,所以只好在 PageB 中处理了:
通过访问 PageB.PreviousPage.IsValid 确认提交页验证是否通过
A.aspx
 <form id="form1" runat="server">
<form id="form1" runat="server">
 <div>
    <div>
 Email:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        Email:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
 <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1"
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1"
 Display="Dynamic" EnableClientScript="False" ErrorMessage="Required"></asp:RequiredFieldValidator>
            Display="Dynamic" EnableClientScript="False" ErrorMessage="Required"></asp:RequiredFieldValidator>
 <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1" EnableClientScript="false"
        <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1" EnableClientScript="false"
 Display="Dynamic" ErrorMessage="Wrong  email format!" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" EnableTheming="True" EnableViewState="False"></asp:RegularExpressionValidator>
            Display="Dynamic" ErrorMessage="Wrong  email format!" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" EnableTheming="True" EnableViewState="False"></asp:RegularExpressionValidator>
 <br />
        <br />
 <asp:Button ID="Button2" runat="server" Text="Post to this page" />
        <asp:Button ID="Button2" runat="server" Text="Post to this page" />
 <asp:Button ID="Button1" runat="server" PostBackUrl="b.aspx" Text="Post to anther page" /></div>
        <asp:Button ID="Button1" runat="server" PostBackUrl="b.aspx" Text="Post to anther page" /></div>
 </form>
    </form>
B.aspx.cs
 protected void Page_Load(object sender, EventArgs e)
 protected void Page_Load(object sender, EventArgs e)
 {
    {
 if (PreviousPage != null && PreviousPage.IsCrossPagePostBack) { // 当前请求为跨页提交
        if (PreviousPage != null && PreviousPage.IsCrossPagePostBack) { // 当前请求为跨页提交
 if (!PreviousPage.IsValid) { // 提交页验证失败
            if (!PreviousPage.IsValid) { // 提交页验证失败
 //Response.Redirect(Request.UrlReferrer.AbsolutePath);  // 直接重定向导致,用户输入信息丢失
                //Response.Redirect(Request.UrlReferrer.AbsolutePath);  // 直接重定向导致,用户输入信息丢失
 Response.Write("<script>alert('验证失败。');history.back()</" + "script>"); // 有点 hack 味道,但是可以保持部分信息
                Response.Write("<script>alert('验证失败。');history.back()</" + "script>"); // 有点 hack 味道,但是可以保持部分信息
 Response.End();
                Response.End();
 return;
                return;
 }
            }
 }
        }
 }
    }
附:
事实上,自己很少使用 Button.PostBackUrl ,对 PostBackUrl 的实现机制还有点误解,以为还是先提交到当前页,然后再 Redirect 到目标页,还傻乎乎的在 CSDN 里面乱吼,http://community.csdn.net/Expert/TopicView3.asp?id=5677458 ,真是惭愧。看了 function WebForm_DoPostBackWithOptions(options) 才知道,原来真的是设置了 form.action 直接提交到了目标页。
关于内部原理,明天再研究了。
 a.aspx是一个注册页面.它上面有一个检测用户名格式的正则表达式控件(RegularExpressionValidator),一个检测用户名是否存在的用户自定义控件(CustomValidator). 正则表达式控件的客户端验证是关闭的,如果注册成功后就提交到b.aspx,我把一个服务器按钮的PostBackUrl="~/b.aspx"
a.aspx是一个注册页面.它上面有一个检测用户名格式的正则表达式控件(RegularExpressionValidator),一个检测用户名是否存在的用户自定义控件(CustomValidator). 正则表达式控件的客户端验证是关闭的,如果注册成功后就提交到b.aspx,我把一个服务器按钮的PostBackUrl="~/b.aspx" 但出现问题了:当用户名不合法或者用户已经存在的情况下,还是提交到b.aspx,这就不符合我的要求了.
但出现问题了:当用户名不合法或者用户已经存在的情况下,还是提交到b.aspx,这就不符合我的要求了. 如果我去掉PostBackUrl="~/b.aspx",让a.aspx提交到自身的页面,一切正常
如果我去掉PostBackUrl="~/b.aspx",让a.aspx提交到自身的页面,一切正常 请教高手,给点指教!!!
请教高手,给点指教!!!也就是说,如果通过 A 执行跨页提交到 B,并且禁用A页面上的验证控件的客户端验证功能,当验证失败之后,依然执行提交到 B。
由于想出不来,当 PageA.IsValid = false 的时候,如何取消跨页提交定向到B,所以只好在 PageB 中处理了:
通过访问 PageB.PreviousPage.IsValid 确认提交页验证是否通过
A.aspx
 <form id="form1" runat="server">
<form id="form1" runat="server"> <div>
    <div> Email:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        Email:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1"
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" Display="Dynamic" EnableClientScript="False" ErrorMessage="Required"></asp:RequiredFieldValidator>
            Display="Dynamic" EnableClientScript="False" ErrorMessage="Required"></asp:RequiredFieldValidator> <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1" EnableClientScript="false"
        <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1" EnableClientScript="false" Display="Dynamic" ErrorMessage="Wrong  email format!" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" EnableTheming="True" EnableViewState="False"></asp:RegularExpressionValidator>
            Display="Dynamic" ErrorMessage="Wrong  email format!" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" EnableTheming="True" EnableViewState="False"></asp:RegularExpressionValidator> <br />
        <br /> <asp:Button ID="Button2" runat="server" Text="Post to this page" />
        <asp:Button ID="Button2" runat="server" Text="Post to this page" /> <asp:Button ID="Button1" runat="server" PostBackUrl="b.aspx" Text="Post to anther page" /></div>
        <asp:Button ID="Button1" runat="server" PostBackUrl="b.aspx" Text="Post to anther page" /></div> </form>
    </form>B.aspx.cs
 protected void Page_Load(object sender, EventArgs e)
 protected void Page_Load(object sender, EventArgs e) {
    { if (PreviousPage != null && PreviousPage.IsCrossPagePostBack) { // 当前请求为跨页提交
        if (PreviousPage != null && PreviousPage.IsCrossPagePostBack) { // 当前请求为跨页提交 if (!PreviousPage.IsValid) { // 提交页验证失败
            if (!PreviousPage.IsValid) { // 提交页验证失败 //Response.Redirect(Request.UrlReferrer.AbsolutePath);  // 直接重定向导致,用户输入信息丢失
                //Response.Redirect(Request.UrlReferrer.AbsolutePath);  // 直接重定向导致,用户输入信息丢失 Response.Write("<script>alert('验证失败。');history.back()</" + "script>"); // 有点 hack 味道,但是可以保持部分信息
                Response.Write("<script>alert('验证失败。');history.back()</" + "script>"); // 有点 hack 味道,但是可以保持部分信息 Response.End();
                Response.End(); return;
                return; }
            } }
        } }
    }附:
事实上,自己很少使用 Button.PostBackUrl ,对 PostBackUrl 的实现机制还有点误解,以为还是先提交到当前页,然后再 Redirect 到目标页,还傻乎乎的在 CSDN 里面乱吼,http://community.csdn.net/Expert/TopicView3.asp?id=5677458 ,真是惭愧。看了 function WebForm_DoPostBackWithOptions(options) 才知道,原来真的是设置了 form.action 直接提交到了目标页。
关于内部原理,明天再研究了。
 
                    
                     
                    
                 
                    
                 
    
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号