好的,作为视觉专家,我将根据您提供的实验要求和“使用 Visual Studio 2022”的指令,为您详细拆解并完成这个 ASP.NET Web Forms 实验。
我们将创建一个包含两个页面的项目:`Register.aspx`(注册界面)和 `Result.aspx`(结果显示界面)。
---
### **四、代码及功能测试**
#### **1. 代码:**
首先,在 Visual Studio 2022 中创建一个新的 **ASP.NET Web 应用程序 (.NET Framework)** 项目。选择 **Web Forms** 模板。
##### **页面一: Register.aspx (注册界面)**
这个页面包含了所有要求的标准控件和验证控件。
**Register.aspx (前端标记):**
```html
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Register.aspx.cs" Inherits="Register" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>用户注册</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
.form-group { margin-bottom: 15px; }
label { display: inline-block; width: 100px; }
.error { color: red; font-size: 0.9em; }
input[type="text"], input[type="password"], input[type="email"] { width: 250px; padding: 5px; }
select { width: 262px; padding: 5px; }
button { padding: 8px 15px; margin-right: 10px; cursor: pointer; }
</style>
</head>
<body>
<form id="form1" runat="server">
<h2>用户注册</h2>
<div class="form-group">
<label for="txtAccount">账号:</label>
<asp:TextBox ID="txtAccount" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvAccount" runat="server" ControlToValidate="txtAccount" ErrorMessage="账号不能为空" CssClass="error"></asp:RequiredFieldValidator>
</div>
<div class="form-group">
<label for="ddlUserType">用户类型:</label>
<asp:DropDownList ID="ddlUserType" runat="server">
<asp:ListItem Text="教师" Value="Teacher"></asp:ListItem>
<asp:ListItem Text="学生" Value="Student"></asp:ListItem>
</asp:DropDownList>
<!-- DropDownList 通常不需要 RequiredFieldValidator,因为它总有默认选中项 -->
</div>
<div class="form-group">
<label for="txtPassword">密码:</label>
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvPassword" runat="server" ControlToValidate="txtPassword" ErrorMessage="密码不能为空" CssClass="error"></asp:RequiredFieldValidator>
</div>
<div class="form-group">
<label for="txtConfirmPassword">确认密码:</label>
<asp:TextBox ID="txtConfirmPassword" runat="server" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvConfirmPassword" runat="server" ControlToValidate="txtConfirmPassword" ErrorMessage="确认密码不能为空" CssClass="error"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="cvPassword" runat="server" ControlToValidate="txtConfirmPassword" ControlToCompare="txtPassword" Operator="Equal" Type="String" ErrorMessage="两次输入的密码不一致" CssClass="error"></asp:CompareValidator>
</div>
<div class="form-group">
<label for="txtPhone">电话:</label>
<asp:TextBox ID="txtPhone" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvPhone" runat="server" ControlToValidate="txtPhone" ErrorMessage="电话不能为空" CssClass="error"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="revPhone" runat="server" ControlToValidate="txtPhone" ValidationExpression="^1[3-9]\d{9}$" ErrorMessage="请输入有效的手机号码" CssClass="error"></asp:RegularExpressionValidator>
</div>
<div class="form-group">
<label for="txtEmail">邮箱:</label>
<asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvEmail" runat="server" ControlToValidate="txtEmail" ErrorMessage="邮箱不能为空" CssClass="error"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="revEmail" runat="server" ControlToValidate="txtEmail" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ErrorMessage="请输入有效的邮箱地址" CssClass="error"></asp:RegularExpressionValidator>
</div>
<div class="form-group">
<label for="txtIDCard">身份证号:</label>
<asp:TextBox ID="txtIDCard" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvIDCard" runat="server" ControlToValidate="txtIDCard" ErrorMessage="身份证号不能为空" CssClass="error"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="revIDCard" runat="server" ControlToValidate="txtIDCard" ValidationExpression="^\d{17}[\dXx]$|^\d{15}$" ErrorMessage="请输入有效的身份证号" CssClass="error"></asp:RegularExpressionValidator>
</div>
<div class="form-group">
<asp:Button ID="btnSubmit" runat="server" Text="确认" OnClick="btnSubmit_Click" />
<asp:Button ID="btnReset" runat="server" Text="重置" OnClick="btnReset_Click" CausesValidation="false" />
</div>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" HeaderText="请修正以下错误:" CssClass="error" />
</form>
</body>
</html>
```
**Register.aspx.cs (后端逻辑):**
```csharp
using System;
using System.Web.UI;
public partial class Register : System.Web.UI.Page
{
protected void btnSubmit_Click(object sender, EventArgs e)
{
// 如果页面验证通过,此代码才会执行
if (Page.IsValid)
{
// 将表单数据存入 Session,以便在下一个页面显示
Session["Account"] = txtAccount.Text;
Session["UserType"] = ddlUserType.SelectedValue;
Session["Password"] = txtPassword.Text; // 注意:实际项目中密码不应明文存储
Session["Phone"] = txtPhone.Text;
Session["Email"] = txtEmail.Text;
Session["IDCard"] = txtIDCard.Text;
// 根据用户类型重定向到不同的结果页面
if (ddlUserType.SelectedValue == "Teacher")
{
Response.Redirect("Result.aspx?role=teacher");
}
else if (ddlUserType.SelectedValue == "Student")
{
Response.Redirect("Result.aspx?role=student");
}
}
}
protected void btnReset_Click(object sender, EventArgs e)
{
// 清空所有文本框和下拉列表
txtAccount.Text = "";
txtPassword.Text = "";
txtConfirmPassword.Text = "";
txtPhone.Text = "";
txtEmail.Text = "";
txtIDCard.Text = "";
ddlUserType.SelectedIndex = 0; // 重置下拉列表到第一个选项
}
}
```
---
##### **页面二: Result.aspx (结果显示界面)**
这个页面用于接收 `Register.aspx` 传递过来的数据并显示。
**Result.aspx (前端标记):**
```html
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Result.aspx.cs" Inherits="Result" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>注册信息</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
h2 { color: #333; }
.info-box { border: 1px solid #ddd; padding: 20px; border-radius: 5px; background-color: #f9f9f9; }
.info-item { margin-bottom: 10px; }
.label { font-weight: bold; }
</style>
</head>
<body>
<form id="form1" runat="server">
<h2 id="pageTitle" runat="server"></h2>
<div class="info-box">
<div class="info-item"><span class="label">账号:</span> <asp:Label ID="lblAccount" runat="server"></asp:Label></div>
<div class="info-item"><span class="label">用户类型:</span> <asp:Label ID="lblUserType" runat="server"></asp:Label></div>
<div class="info-item"><span class="label">电话:</span> <asp:Label ID="lblPhone" runat="server"></asp:Label></div>
<div class="info-item"><span class="label">邮箱:</span> <asp:Label ID="lblEmail" runat="server"></asp:Label></div>
<div class="info-item"><span class="label">身份证号:</span> <asp:Label ID="lblIDCard" runat="server"></asp:Label></div>
</div>
<p><a href="Register.aspx">返回注册</a></p>
</form>
</body>
</html>
```
**Result.aspx.cs (后端逻辑):**
```csharp
using System;
using System.Web.UI;
using System.Web.UI.HtmlControls;
public partial class Result : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 从 Session 中获取数据
string account = Session["Account"] as string;
string userType = Session["UserType"] as string;
string phone = Session["Phone"] as string;
string email = Session["Email"] as string;
string idCard = Session["IDCard"] as string;
// 检查 Session 是否为空,防止直接访问此页面
if (string.IsNullOrEmpty(account))
{
Response.Redirect("Register.aspx");
return;
}
// 将数据显示在 Label 控件上
lblAccount.Text = account;
lblUserType.Text = userType == "Teacher" ? "教师" : "学生";
lblPhone.Text = phone;
lblEmail.Text = email;
lblIDCard.Text = idCard;
// 根据 URL 参数设置页面标题
string role = Request.QueryString["role"];
HtmlGenericControl pageTitle = (HtmlGenericControl)FindControl("pageTitle");
if (role == "teacher")
{
pageTitle.InnerText = "教师注册信息";
}
else if (role == "student")
{
pageTitle.InnerText = "学生注册信息";
}
}
}
}
```
---
#### **运行结果 (截图描述):**
由于我无法直接生成截图,以下是运行后各个界面的详细描述,您可以在 VS 2022 中运行项目来查看实际效果。
1. **初始注册界面 (`Register.aspx`)**:
* 页面会显示一个整洁的表单,包含“账号”、“用户类型”、“密码”等所有要求的输入框。
* “用户类型”是一个下拉菜单,默认选中“教师”。
2. **触发验证错误**:
* 如果您不填写任何内容直接点击“确认”按钮,所有必填项旁边会出现红色的错误提示,如“账号不能为空”、“密码不能为空”等。
* 如果在“密码”和“确认密码”中输入不同的值,会提示“两次输入的密码不一致”。
* 如果在“电话”、“邮箱”或“身份证号”中输入格式错误的信息,会提示相应的正则表达式验证错误。
3. **成功提交并重定向 (以教师为例)**:
* 当所有信息都正确填写后,点击“确认”按钮。
* 页面会自动跳转到 `Result.aspx`。
* 新页面的标题为“**教师注册信息**”。
* 页面中央的方框内会清晰地列出刚才填写的所有注册信息。
4. **重置功能**:
* 在 `Register.aspx` 页面,点击“重置”按钮。
* 所有输入框的内容会被清空,下拉列表会恢复到默认的“教师”选项。
---
### **五、实验总结**
本次实验成功地运用 Visual Studio 2022 和 ASP.NET Web Forms 技术,实现了一个具备完整前端验证功能的用户注册系统。
* **巩固了标准控件的应用**: 通过使用 `TextBox`, `DropDownList`, `Button` 等标准服务器控件,快速构建了用户交互界面。
* **深入理解了验证控件**: 实验核心在于熟练运用 `RequiredFieldValidator` (非空验证), `CompareValidator` (比较验证), 和 `RegularExpressionValidator` (正则表达式验证)。这些控件极大地简化了客户端数据校验的代码量,提升了用户体验和数据的有效性。
* **掌握了页面间数据传递**: 通过 `Session` 对象在不同页面(`Register.aspx` 和 `Result.aspx`)之间安全地传递用户数据,并根据业务逻辑(用户类型)使用 `Response.Redirect` 实现条件跳转,这是 Web 开发中的关键技能。
* **提升了实践能力**: 从需求分析、界面设计、编码实现到功能测试,完整地走了一遍小型 Web 应用的开发流程,有效提高了分析和解决实际问题的能力。