ASP.NET Core 6 MVC如何获取视图HTML表单提交数据并存入对象
ASP.NET Core 6 MVC 表单提交绑定对象实现方案
你不需要手动逐字段读取表单值,ASP.NET Core 内置的模型绑定功能可以自动把提交的表单数据映射到C#对象,按以下三步实现即可:
1. 创建对应表单字段的模型类
在项目的Models文件夹下新建ComplaintForm.cs类,类的属性名必须和表单input/select/textarea的name属性名匹配(大小写不敏感),多选复选框用集合类型接收:
using System.ComponentModel.DataAnnotations; namespace YourProjectName.Models; public class ComplaintForm { /// <summary> /// 是否为本行客户 /// </summary> public string CustomerCheck { get; set; } = string.Empty; /// <summary> /// 用户全名 /// </summary> [Required(ErrorMessage = "全名不能为空")] public string Fullname { get; set; } = string.Empty; /// <summary> /// CNIC/SNIC证件号 /// </summary> [Required(ErrorMessage = "证件号不能为空")] public string Cnic { get; set; } = string.Empty; /// <summary> /// 投诉涉及领域 /// </summary> [Required(ErrorMessage = "请选择投诉涉及领域")] public string ConcernedArea { get; set; } = string.Empty; /// <summary> /// 投诉详情 /// </summary> [Required(ErrorMessage = "请填写投诉详情")] public string Complaint { get; set; } = string.Empty; /// <summary> /// 事件发生日期 /// </summary> [Required(ErrorMessage = "请选择事件日期")] public DateTime IncidentDate { get; set; } /// <summary> /// 涉及支行名称(非必填) /// </summary> public string? BranchName { get; set; } /// <summary> /// 首选沟通方式 /// </summary> [Required(ErrorMessage = "请选择首选沟通方式")] public string PreferredCommunicationMedium { get; set; } = string.Empty; /// <summary> /// 首选致电时间(多选,用字符串集合接收) /// </summary> [Required(ErrorMessage = "请选择首选致电时间")] public List<string> PreferredCallTime { get; set; } = new(); /// <summary> /// 联系电话 /// </summary> [Required(ErrorMessage = "联系电话不能为空")] public string CustomerNumber { get; set; } = string.Empty; /// <summary> /// 邮箱地址 /// </summary> [Required(ErrorMessage = "邮箱地址不能为空")] [EmailAddress(ErrorMessage = "邮箱格式不正确")] public string EmailAddress { get; set; } = string.Empty; }
2. 编写控制器处理方法
在对应控制器(默认是HomeController)中添加GET和POST处理方法:
- GET方法负责返回表单页面
- POST方法参数直接接收
ComplaintForm类型,模型绑定会自动把表单值填充到这个对象里,拿到后可以直接操作、打印、存储
using Microsoft.AspNetCore.Mvc; using YourProjectName.Models; namespace YourProjectName.Controllers; public class HomeController : Controller { // GET:返回表单页面 public IActionResult Index() { return View(); } // POST:接收提交的表单数据 [HttpPost] public IActionResult Index(ComplaintForm formData) { // 模型校验不通过(比如必填项为空、格式错误),直接返回表单页提示错误 if (!ModelState.IsValid) { return View(formData); } // 此处formData就是填充完成的表单对象,直接读取属性即可打印所有内容 // 示例:拼接所有提交内容 string submitInfo = $@" ===== 用户投诉提交信息 ===== 是否为本行客户:{formData.CustomerCheck} 用户姓名:{formData.Fullname} 证件号:{formData.Cnic} 投诉领域:{formData.ConcernedArea} 投诉详情:{formData.Complaint} 事件日期:{formData.IncidentDate:yyyy-MM-dd} 涉及支行:{formData.BranchName ?? "未填写"} 首选沟通方式:{formData.PreferredCommunicationMedium} 首选致电时间:{string.Join("、", formData.PreferredCallTime)} 联系电话:{formData.CustomerNumber} 邮箱地址:{formData.EmailAddress} "; // 你可以在此处做后续操作:写入数据库、写日志、发通知邮件等 // 示例:把提交信息传给结果页展示 ViewBag.SubmitInfo = submitInfo; return View("SubmitSuccess"); } // 提交成功展示页 public IActionResult SubmitSuccess() { return View(); } }
3. 现有视图的小调整
你当前写的原生HTML表单不需要大改,已经指定method="post",默认就会提交到上面写的POST方法,只需要修复一个小bug:
「是否为ABL客户」的Yes单选框关联label的
for属性值是Yes(大写Y),但对应input的id是yes(小写y),会导致点击文字无法选中单选框,把label改成<label for="yes">Yes</label>即可。
如果后续想做更严谨的强类型视图,可以在视图顶部添加@model YourProjectName.Models.ComplaintForm,用ASP.NET Core的Tag Helper生成表单元素,不修改也不影响当前功能。
注意事项
- 模型绑定依赖表单元素的
name属性和模型属性名匹配,不要随意修改现有表单元素的name值,否则会出现绑定失败、属性值为空的问题 - 同name的复选框多选项必须用
List<string>或者string[]类型接收,否则只能拿到最后一个选中的值 - 不需要手动通过
Request.Form["字段名"]逐字段取值,模型绑定会自动完成类型转换和值映射
内容的提问来源于stack exchange,提问作者Kamran Bajwa
相关产品推荐
相关产品推荐

