ASP.NET Membership Provider登录重定向报错:页面仅能有一个服务器端表单标签
问题分析与解决方案
错误原因
ASP.NET规定一个页面只能包含一个带runat="server"属性的form标签,你遇到的错误正是因为ChangePassword.aspx页面最终渲染时出现了两个服务器端form标签,根源有两种可能:
- 母版页与内容页form冲突:如果
ChangePassword.aspx实际使用了Site.master母版页,母版页里已经存在<form id="form1" runat="server">,而你在ChangePassword.aspx中又自行添加了<form id="ChangePassword" runat="server">,两者叠加导致重复。 - 用户控件包含重复form:如果
ChangePassword.aspx没有使用母版页,那么你引用的Header.ascx或Footer.ascx用户控件内部可能也包含了带runat="server"的form标签,和页面自身的form形成重复。
此外,你的登录逻辑存在顺序问题:在调用Membership.ValidateUser验证用户身份之前就执行重定向,此时用户尚未完成认证,如果ChangePassword.aspx设置了需要登录访问,会触发FormsAuthentication的重定向机制,进一步加剧页面渲染异常。
解决步骤
第一步:修复form重复问题
根据你的页面结构,分两种场景处理:
场景1:ChangePassword.aspx应使用Site.master母版页
- 修改
ChangePassword.aspx的页面指令,添加母版页引用:
<%@ Page Language="VB" AutoEventWireup="false" Inherits="VL.ChangePassword" Codebehind="ChangePassword.aspx.vb" MasterPageFile="~/Site.master" %>
- 删除页面中原有的
<uc1:header>、<uc1:footer>和<form>标签,将密码修改的内容放到母版页的内容占位符中:
<asp:Content ID="ContentMain" ContentPlaceHolderID="MainContent" runat="server"> <h2>Change Your Password</h2> <!-- 原form内部的所有控件和内容 --> </asp:Content>
场景2:ChangePassword.aspx不使用母版页
- 打开
Header.ascx和Footer.ascx文件,检查并移除其中所有带runat="server"的form标签,确保只有ChangePassword.aspx页面自身存在一个服务器端form。
第二步:调整登录逻辑顺序
将用户身份验证放到脏标记检查之前,避免未认证导致的重定向循环:
Dim hash As SecurePassword = New SecurePassword() If Membership.ValidateUser(myLogin.UserName, myLogin.Password) Then ' 先完成用户认证,再检查脏标记 If Not hash.IsAccountSecurelyUpgraded(myLogin.UserName) Then ' 终止当前页面执行,直接重定向 Response.Redirect("/aspnet_membership/ChangePassword.aspx", True) End If ' 原有的后续登录成功逻辑 ...some code... End If
内容的提问来源于stack exchange,提问作者Samra
相关产品推荐
相关产品推荐

