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

ASP.NET MVC修改后的数据列表无法正确提交至控制器的问题

问题解决方法

原因是ASP.NET MVC的ModelState优先机制:回发时框架会优先使用ModelState中存储的旧值,而非POST提交的新值,重新渲染视图时这个问题会更明显。

解决步骤:

  • 在控制器处理完POST请求后,若需重新返回视图,针对性清除对应字段的ModelState状态:
    public async Task<PartialViewResult> Detail(MaterialDetailViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            // 业务逻辑处理
        }
        // 清除GridLanguageList中FormatType字段的旧值状态
        for (int i = 0; i < viewModel.GridLanguageList.Count; i++)
        {
            ModelState.Remove($"GridLanguageList[{i}].FormatType");
        }
        // 重新填充下拉列表数据源(确保选项正确)
        viewModel.FormatTypesList = GetFormatTypesSource(); // 替换成你获取下拉选项的方法
        return PartialView(viewModel);
    }
    
  • 若无需保留其他验证信息,也可直接调用ModelState.Clear()清除所有状态,但建议针对性清除以保留必要的验证反馈。

Kendo DatePicker 无法更新值的问题

原因是手动设置的Name属性(RevisionDate_+i)不符合MVC模型绑定的命名规则,框架无法识别该名称对应GridLanguageList[i].RevisionDate属性,导致无法接收新值。

解决方法:使用DatePickerFor方法自动绑定,框架会生成正确的属性路径名称:

@if (Model.GridLanguageList != null && Model.GridLanguageList.Count > 0)
{
    for (int i = Model.GridLanguageList.Count() - 1; i >= 0; i--)
    {
        @Html.HiddenFor(m => m.GridLanguageList[i].IdCaseLanguage)
        ...
        @Html.DropDownListFor(m => m.GridLanguageList[i].FormatType, Model.FormatTypesList, new { @class= "form-control form-control-sm" })
        <!-- 改用DatePickerFor自动生成绑定名称 -->
        @(Html.Kendo().DatePickerFor(m => m.GridLanguageList[i].RevisionDate)
          .Format(Constants.DateFormat)
          .HtmlAttributes(new { @class = "dateForm" }))
    }
}

修改后生成的input标签name会是GridLanguageList[i].RevisionDate,与ViewModel的属性路径完全匹配,提交后即可正确绑定到对应字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:47:09