You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC提交表单后无法获取模型值求助

表单集合模型绑定为null的解决方法

问题场景

尝试创建包含过滤器集合的表单,通过文本框获取用户输入,提交后控制器的IEnumerable<FilterCondition>参数始终为null,但使用IFormCollection能正常读取各文本框的值。

当前代码

视图(cshtml)

<table>
@{
    for (int i = 0; i < 3; i++)
    {
        <tr>
            <td>
                @Html.TextBox(i+".Code")
            </td>
            <td>
                @Html.Hidden(i+".FieldName")
            </td>
            <td>
                @Html.TextBox(i+".FieldValue")
            </td>
            <td>
                @Html.TextBox(i+".Operator")
            </td>
        </tr>
    }
    <tr>
        <td>
            <input type="submit" value="Create" />
        </td>
    </tr>
}
</table>

模型类

public class FilterCondition
{
    public string? Code { get; set; }
    public string? FieldName { get; set; }
    public string? FieldValue { get; set; }
    public string? Operator { get; set; }
}

控制器代码

[HttpPost]
public ActionResult Submitter(IEnumerable<FilterCondition> formVals)
{
    try
    {
        return RedirectToAction(nameof(Index));
    }
    catch
    {
        return View();
    }
}

问题原因

ASP.NET MVC的模型绑定机制需要表单字段名称与控制器参数的集合结构匹配。当前表单字段名称为0.Code、1.FieldName等,未关联到控制器参数formVals,导致模型绑定无法识别这些字段属于formVals集合的元素,因此参数值为null。

解决方法

修改视图中的输入框名称,为每个字段添加控制器参数名作为前缀,并采用数组索引格式:参数名[索引].属性名,让模型绑定能正确识别集合元素。

修改后的视图代码

<table>
@{
    for (int i = 0; i < 3; i++)
    {
        <tr>
            <td>
                @Html.TextBox($"formVals[{i}].Code")
            </td>
            <td>
                @Html.Hidden($"formVals[{i}].FieldName")
            </td>
            <td>
                @Html.TextBox($"formVals[{i}].FieldValue")
            </td>
            <td>
                @Html.TextBox($"formVals[{i}].Operator")
            </td>
        </tr>
    }
    <tr>
        <td>
            <input type="submit" value="Create" />
        </td>
    </tr>
}
</table>

可选方案:使用包装模型类

如果更倾向于用包装类,可创建包含集合的模型:

public class FilterModel
{
    public IEnumerable<FilterCondition> FilterConditions { get; set; } = new List<FilterCondition>();
}

然后修改控制器参数:

[HttpPost]
public ActionResult Submitter(FilterModel model)
{
    // 访问model.FilterConditions获取数据
    try
    {
        return RedirectToAction(nameof(Index));
    }
    catch
    {
        return View();
    }
}

对应的视图字段名称改为FilterConditions[{i}].Code、FilterConditions[{i}].FieldName等即可。

内容的提问来源于stack exchange,提问作者srinivasa rao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:53:19