PAYATHON 2026

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 错误,因此无法仅凭现有代码判断是否存在格式问题。先确认字段名称和提交值,再查看相应的验证错误。

备注:内容仅供参考。