ASP.NET Web Pages – HTML 表单

ASP.NET Web Pages(Razor)中最实用的 HTML 表单全攻略

(含 GET、POST、防伪令牌、验证、文件上传、Ajax 等全部常用场景)

1. 最基础的表单(POST 提交到同一个页面)

<!-- File: Contact.cshtml -->
@{
    var name = "", email = "", message = "";
    var success = false;

    if (IsPost) {
        // 防伪令牌(必须!防止 CSRF)
        AntiForgery.Validate();

        name    = Request["name"];
        email   = Request["email"];
        message = Request["message"];

        // 简单服务器端验证
        if (name.IsEmpty())    { ModelState.AddError("name", "姓名不能为空"); }
        if (!email.IsEmail())  { ModelState.AddError("email", "邮箱格式不正确"); }
        if (message.Length < 10) { ModelState.AddError("message", "留言太短"); }

        if (ModelState.IsValid) {
            // 保存到数据库(示例)
            var db = Database.Open("MySite");
            db.Execute("INSERT INTO Messages (Name,Email,Message,AddTime) VALUES (@0,@1,@2,@3)",
                name, email, message, DateTime.Now);

            success = true;
            name = email = message = "";  // 清空表单
        }
    }
}

<!DOCTYPE html>
<html>
<head><title>联系我们</title></head>
<body>
    @if(success){
        <div class="alert alert-success">感谢您的留言,我们会尽快回复!</div>
    }

    <form method="post">
        <!-- 必须加上防伪令牌 -->
        @AntiForgery.GetHtml()

        <p>
            <label>姓名:</label><br>
            <input type="text" name="name" value="@name" />
            @Html.ValidationMessage("name")
        </p>

        <p>
            <label>邮箱:</label><br>
            <input type="email" name="email" value="@email" />
            @Html.ValidationMessage("email")
        </p>

        <p>
            <label>留言:</label><br>
            <textarea name="message" rows="5" cols="50">@message</textarea>
            @Html.ValidationMessage("message")
        </p>

        <button type="submit">提交留言</button>
    </form>
</body>
</html>

2. 所有常用表单控件写法一览表

控件类型Razor 写法(推荐)传统写法(可读性更好)
文本框<input name="username" value="@userName" />@Html.TextBox("username", userName)
密码框<input type="password" name="pwd" />@Html.Password("pwd")
隐藏域@AntiForgery.GetHtml()@Html.Hidden("id", 123)
单选按钮<input type="radio" name="sex" value="1" checked @(sex=="1"?"checked":"") /> 男
复选框<input type="checkbox" name="hobby" value="read" @(hobbies.Contains("read")?"checked":"") /> 阅读
下拉列表“`html
多行文本<textarea name="content">@content</textarea>@Html.TextArea("content", content, 8, 60, null)
文件上传<input type="file" name="avatar" />(必须见第 5 点)

3. 表单验证神器(无需写一堆 if)

@{
    Validation.RequireField("name", "姓名必填");
    Validation.RequireField("email", "邮箱必填");
    Validation.Add("email", Validator.EmailAddress("邮箱格式错误"));
    Validation.Add("age", Validator.Integer("必须是数字"), Validator.Range(1,120,"年龄范围 1-120"));

    if (IsPost) {
        if (Validation.IsValid()) {
            // 所有验证通过 → 安全处理业务
        } else {
            // 显示所有错误
            @Html.ValidationSummary()
        }
    }
}

4. 表单提交到不同页面(经典登录示例)

<!-- Login.cshtml -->
<form method="post" action="~/Account/DoLogin.cshtml">
    @AntiForgery.GetHtml()
    用户名:<input name="username" /><br>
    密码:<input type="password" name="password" /><br>
    <button>登录</button>
</form>
<!-- Account/DoLogin.cshtml -->
@{
    AntiForgery.Validate();

    var user = Request["username"];
    var pwd  = Request["password"];

    if (WebSecurity.Login(user, pwd, persistCookie: true)) {
        Response.Redirect("~/Admin/Index.cshtml");
    } else {
        <h3 style="color:red">用户名或密码错误</h3>
    }
}

5. 文件上传完整示例(单文件 + 多文件)

<!-- Upload.cshtml -->
<form method="post" enctype="multipart/form-data">
    @AntiForgery.GetHtml()

    <p>上传头像:<input type="file" name="avatar" /></p>
    <p>上传附件:<input type="file" name="files" multiple /></p>

    <button>提交</button>
</form>

@if(IsPost){
    AntiForgery.Validate();

    var uploadPath = "~/Uploads/";
    var savePath = Server.MapPath(uploadPath);
    if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath);

    // 单文件
    var avatar = Request.Files["avatar"];
    if (avatar != null && avatar.ContentLength > 0) {
        var fileName = Path.GetFileName(avatar.FileName);
        avatar.SaveAs(savePath + fileName);
        <p>头像上传成功:@fileName</p>
    }

    // 多文件
    var files = Request.Files["files"];
    for(int i = 0; i < files.Count; i++){
        var f = files[i];
        if(f.ContentLength > 0){
            f.SaveAs(savePath + Path.GetFileName(f.FileName));
        }
    }
}

6. Ajax 提交表单(jQuery 版,不刷新页面)

<script src="~/Scripts/jquery-3.6.0.min.js"></script>
<script>
$(function(){
    $("form").submit(function(e){
        e.preventDefault();   // 阻止普通提交

        var formData = new FormData(this);  // 支持文件上传

        $.ajax({
            url: "",                  // 提交到当前页面
            type: "POST",
            data: formData,
            processData: false,
            contentType: false,
            success: function(html){
                $("#result").html(html);   // 直接替换结果区域
            }
        });
    });
});
</script>

<div id="result"></div>

终极总结:表单必背 5 行代码

@AntiForgery.GetHtml()          <!-- 1. 防 CSRF(必须) -->
@if(IsPost){ }                  <!-- 2. 判断是否提交 -->
Validation.RequireField(...)    <!-- 3. 服务端验证 -->
@Html.ValidationMessage("xxx")  <!-- 4. 显示错误 -->
enctype="multipart/form-data"   <!-- 5. 文件上传时必须加 -->

把这 5 点记牢,你写的任何表单都安全、美观、健壮。

需要我给你一个包含「注册 + 登录 + 个人资料修改 + 头像上传 + Ajax 验证」的完整表单模板项目吗?全部 Razor 语法,复制即用,500KB 不到。

文章已创建 2863

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部