C# MVC表单无法向控制器回传数据,求问题原因
问题原因及解决方案
核心原因
你的视图中使用了asp-for标签助手,但未在视图顶部声明对应的模型类,导致asp-for无法生成正确的name属性。HTML表单仅会提交带有name属性的元素值,因此控制器的FormCollection中没有数据。此外,phoneNumber字段使用type="number"并不合理——电话号码常包含+、-等非数字字符,浏览器会拒绝提交不符合格式的内容,也可能导致数据丢失。
解决步骤
1. 创建表单视图模型
在项目中新建视图模型类,用于绑定表单数据:
public class FormViewModel { public int OrganizationID { get; set; } public int ExternalPersonalID { get; set; } public string PhoneNumber { get; set; } // 改用string类型存储电话号码 }
2. 修改视图代码
在视图顶部添加模型声明,同时调整phoneNumber的输入类型:
@model 你的项目命名空间.FormViewModel @using (@Html.BeginForm("ReceiveForm1", "Home", FormMethod.Post)) { <div class="form-group"> <label for="OrganizationID">Organization ID</label> <input type="number" class="form-control" asp-for="OrganizationID" aria-describedby="emailHelp" placeholder="Enter Organization ID"> </div> <div class="form-group"> <label for="ExternalPersonalID">External Personal ID</label> <input type="number" class="form-control" asp-for="ExternalPersonalID" placeholder="Enter External Personal ID"> </div> <div class="form-group"> <label for="PhoneNumber">Phone Number</label> <input type="text" class="form-control" asp-for="PhoneNumber" placeholder="Enter Phone Number"> </div> <button type="submit" class="btn btn-primary">Submit</button> }
注:
asp-for会自动生成与模型属性名一致的name和id属性,确保表单数据能被正确提交到服务器。
3. 优化控制器代码
直接使用视图模型接收表单数据,比FormCollection更简洁且类型安全:
[HttpPost] public ActionResult ReceiveForm1(FormViewModel model) { // 直接通过model.OrganizationID、model.ExternalPersonalID、model.PhoneNumber获取数据 IEnumerable<Form1Return> personData = GetPersonInformation(model); return View(personData); }
若坚持使用FormCollection,只要视图生成了正确的name属性,就能在collection中获取到对应键值对。
4. 验证表单渲染结果
运行项目后查看页面源代码,确认每个input元素都包含name属性,示例如下:
<input type="number" class="form-control" id="OrganizationID" name="OrganizationID" aria-describedby="emailHelp" placeholder="Enter Organization ID">
内容的提问来源于stack exchange,提问作者Jonathan Small
相关产品推荐
相关产品推荐

