代码改变世界

关于跨页提交与验证控件的问题

2007-07-27 01:02  晓风残月  阅读(1013)  评论(0编辑  收藏  举报
问题来源

a.aspx是一个注册页面.它上面有一个检测用户名格式的正则表达式控件(RegularExpressionValidator),一个检测用户名是否存在的用户自定义控件(CustomValidator). 正则表达式控件的客户端验证是关闭的,如果注册成功后就提交到b.aspx,我把一个服务器按钮的PostBackUrl="~/b.aspx"
但出现问题了:当用户名不合法或者用户已经存在的情况下
,还是提交到b.aspx,这就不符合我的要求了.
如果我去掉PostBackUrl
="~/b.aspx",让a.aspx提交到自身的页面,一切正常
请教高手
,给点指教!!!
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">
    
<div>
        Email:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1"
            Display
="Dynamic" EnableClientScript="False" ErrorMessage="Required"></asp:RequiredFieldValidator>
        
<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>
        
<br />
        
<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>
    
</form>


B.aspx.cs
 protected void Page_Load(object sender, EventArgs e)
    
{
        
if (PreviousPage != null && PreviousPage.IsCrossPagePostBack) // 当前请求为跨页提交
            if (!PreviousPage.IsValid) // 提交页验证失败
                
//Response.Redirect(Request.UrlReferrer.AbsolutePath);  // 直接重定向导致,用户输入信息丢失
                Response.Write("<script>alert('验证失败。');history.back()</" + "script>"); // 有点 hack 味道,但是可以保持部分信息
                Response.End();
                
return;
            }

        }

    }


附:
事实上,自己很少使用 Button.PostBackUrl ,对 PostBackUrl 的实现机制还有点误解,以为还是先提交到当前页,然后再 Redirect 到目标页,还傻乎乎的在 CSDN 里面乱吼,http://community.csdn.net/Expert/TopicView3.asp?id=5677458 ,真是惭愧。看了 function WebForm_DoPostBackWithOptions(options) 才知道,原来真的是设置了 form.action 直接提交到了目标页。
关于内部原理,明天再研究了。