ASP.NET Core MVC 表单提交后模型属性为何仍为 0?
结论
ASP.NET Core MVC 会根据表单字段的名称,将提交的值绑定到 POST 操作的 FutureValueModel model 参数。你贴出的视图里没有显示 @model 声明。先为视图指定模型类型,并确认 MVC Tag Helpers 已启用,再检查浏览器生成的 HTML。字段应带有与模型属性对应的 name,例如 name="MonthlyInvestment"。如果 Tag Helpers 未生效,asp-for 可能会作为普通属性留在 HTML 中,表单也就不会提交模型绑定所需的字段名称。
在视图中声明模型类型
在 .cshtml 文件顶部、其他 Razor 内容之前加入:
@model FutureValue.Models.FutureValueModel
例如:
@model FutureValue.Models.FutureValueModel
@{
Layout = null; //not a razor layout
}
这样,asp-for="MonthlyInvestment" 等表达式就会根据 FutureValueModel 生成表单字段。你现有的 POST 操作可以按这种方式接收模型:
[HttpPost]
public IActionResult Index(FutureValueModel model)
{
ViewBag.FV = model.CalculateFutureValue();
return View(model);
}
确认 Tag Helpers 已启用
检查项目的 _ViewImports.cshtml 是否包含:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
如果项目中没有 _ViewImports.cshtml,可以把这一行加在视图顶部。Tag Helpers 启用后,asp-for、asp-action 等属性才会转换为 HTML 表单属性。
检查实际提交的字段
在浏览器开发者工具中查看页面生成的 HTML。输入框应类似这样:
<input type="text" id="MonthlyInvestment" name="MonthlyInvestment" value="...">
也可以提交表单后,在 Network 面板查看请求负载。确认其中包含 MonthlyInvestment、YearlyInterestRate 和 Years 这些字段及其值。如果字段缺少 name,或名称与模型属性不对应,模型绑定就无法按预期填充值。
仍未绑定时检查验证状态
如果请求中包含这些字段,但模型属性仍是默认值,可以检查 ModelState:
[HttpPost]
public IActionResult Index(FutureValueModel model)
{
if (!ModelState.IsValid)
{
// 检查 ModelState 中的验证错误
}
ViewBag.FV = model.CalculateFutureValue();
return View(model);
}
也要检查 decimal 字段的输入格式是否能按当前应用的区域性设置解析。题目没有提供浏览器生成的 HTML、请求负载或 ModelState 错误,因此无法仅凭现有代码判断是否存在格式问题。先确认字段名称和提交值,再查看相应的验证错误。
备注:内容仅供参考。
