如何正确绑定模型列表字段以实现前端修改数据回传到控制器

阿雪同学_9638

阿雪同学_9638

2026-07-18

898人浏览

原创

如何正确绑定模型列表字段以实现前端修改数据回传到控制器

本文详解 asp.net mvc 中动态列表模型绑定的关键问题,重点解决 dropdownlist 和 kendo ui datepicker 等控件因命名不规范导致值无法回传至控制器的常见故障,并提供标准化、可复用的绑定方案。

本文详解 asp.net mvc 中动态列表模型绑定的关键问题,重点解决 dropdownlist 和 kendo ui datepicker 等控件因命名不规范导致值无法回传至控制器的常见故障,并提供标准化、可复用的绑定方案。

在 ASP.NET MVC 中,将包含多个子项的集合(如 GridLanguageList)从视图提交至控制器时,模型绑定器依赖严格的 HTML name 属性命名规则。若命名不符合 ModelPropertyName[Index].PropertyName 格式(例如 GridLanguageList[0].Title),则对应字段将无法被正确反序列化,最终在控制器中表现为 null 或原始默认值——这正是你遇到 FormatType 下拉框和 PublicationDate/RevisionDate 日期选择器值未更新的根本原因。

✅ 正确的绑定方式:确保 name 属性符合模型绑定规范

MVC 模型绑定器只识别形如 GridLanguageList[0].FormatType 或 GridLanguageList[0].PublicationDate 的 name 属性。你原代码中:

前端设计优化skill
前端设计优化skill

前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。

下载
  • ✅ @Html.TextBoxFor(m => m.GridLanguageList[i].SubTitle) → 自动生成合规 name(如 GridLanguageList[0].SubTitle),故能正常回传;
  • ❌ @(Html.Kendo().DatePicker().Name("RevisionDate_" + i + "...")) → 手动指定 name="RevisionDate_0",脱离模型路径,绑定失败;
  • ❌ @Html.DropDownListFor(m => m.GridLanguageList[i].FormatType, ...) 虽然 lambda 表达式正确,但若 Model.FormatTypesList 是 SelectList 且未正确设置 DataValueField/DataTextField,或 FormatType 类型与选项值不匹配(如 int vs "1" 字符串),也会导致绑定失效。

✅ 修正后的标准写法(推荐)

@for (int i = 0; i 
        <div class="panel panelIese">
            <div class="panel-heading bg-danger text-white">
                <div class="col-md-11">@Model.GridLanguageList[i].DescripLanguageIso</div>
            </div>
            <div class="panel-body">
                <!-- 隐藏字段(保持索引连续性) -->
                @Html.HiddenFor(m => m.GridLanguageList[i].IdCaseLanguage)
                @Html.HiddenFor(m => m.GridLanguageList[i].IdCase)
                @Html.HiddenFor(m => m.GridLanguageList[i].IdLanguageIso)
                @Html.HiddenFor(m => m.GridLanguageList[i].FormatType)
                @Html.HiddenFor(m => m.GridLanguageList[i].PublicationDate)
                @Html.HiddenFor(m => m.GridLanguageList[i].RevisionDate)
                @Html.HiddenFor(m => m.GridLanguageList[i].ModPdfDate)

                <!-- 文本区域 & 输入框(自动绑定) -->
                <div class="form-group">
                    @Html.Label("Title test:")
                    @Html.TextAreaFor(m => m.GridLanguageList[i].Title, 3, 300, 
                        new { @class = "form-control form-control-sm", maxlength = "250" })
                </div>

                <div class="form-group">
                    @Html.LabelFor(m => m.GridLanguageList[i].SubTitle)
                    @Html.TextBoxFor(m => m.GridLanguageList[i].SubTitle, 
                        new { @class = "form-control form-control-sm", maxlength = "360" })
                </div>

                <!-- Kendo DatePicker:必须使用完整模型路径命名 -->
                <div class="row">
                    <div class="form-group col-md-4">
                        @Html.LabelFor(m => m.GridLanguageList[i].PublicationDate)
                        @(Html.Kendo().DatePicker()
                            .Name($"GridLanguageList[{i}].PublicationDate") // ✅ 关键!
                            .Format(Constants.DateFormat)
                            .HtmlAttributes(new { @class = "dateForm" })
                            .Value(Model.GridLanguageList[i].PublicationDate))
                    </div>
                    <div class="form-group col-md-4">
                        @Html.LabelFor(m => m.GridLanguageList[i].RevisionDate)
                        @(Html.Kendo().DatePicker()
                            .Name($"GridLanguageList[{i}].RevisionDate") // ✅ 关键!
                            .Format(Constants.DateFormat)
                            .HtmlAttributes(new { @class = "dateForm" })
                            .Value(Model.GridLanguageList[i].RevisionDate))
                    </div>
                    <div class="form-group col-md-4">
                        @Html.LabelFor(m => m.GridLanguageList[i].Pages)
                        @Html.TextBoxFor(m => m.GridLanguageList[i].Pages, 
                            new { @class = "form-control", maxlength = "5" })
                    </div>
                </div>

                <!-- DropDownList:确保 Value 字段类型一致 -->
                <div class="form-group col-md-6">
                    @Html.LabelFor(m => m.GridLanguageList[i].FormatType)
                    @Html.DropDownListFor(
                        m => m.GridLanguageList[i].FormatType,
                        Model.FormatTypesList, // SelectList,需确保 DataValueField 为 int/string 且与 FormatType 类型匹配
                        "-- Select --",
                        new { @class = "form-control form-control-sm" })
                </div>
            </div>
        </div>
    
}

⚠️ 关键注意事项

  • 索引必须连续且从 0 开始:避免使用倒序循环(for (int i = Count-1; i >= 0; i--)),否则生成的 name 如 GridLanguageList[4].Title、GridLanguageList[3].Title… 会破坏绑定器对“连续数组”的预期,导致部分项丢失。
  • Kendo 控件必须手动设置 .Name():Kendo 的 DatePicker、DropDownList 等不自动推导模型路径,必须显式设为 GridLanguageList[0].PropertyName 格式。
  • 下拉框值类型一致性:若 FormatType 是 int,则 SelectList 的 DataValueField 必须返回整数字符串(如 "1"),且 ViewBag/ViewModel 中初始化时确保 FormatTypesList 的 value 值可被转换为 int。
  • 验证 ModelState:控制器中务必检查 if (!ModelState.IsValid) 并记录错误,可快速定位绑定失败字段:
    if (!ModelState.IsValid)
    {
        var errors = ModelState.Values.SelectMany(v => v.Errors);
        Logger.Warn($"Model binding errors: {string.Join("; ", errors)}");
    }

✅ 总结

模型绑定不是“魔法”,而是严格依赖 HTML name 属性与 C# 属性路径的一一映射。只要确保所有输入控件(包括 Kendo 组件)的 name 属性符合 ParentCollection[Index].Property 规范,并维持索引连续性,即可稳定实现列表数据的双向绑定。摒弃自定义 name(如 RevisionDate_0),拥抱强类型表达式(m => m.GridLanguageList[i].Xxx)并辅以 Kendo 的显式 .Name() 设置,是解决此类问题的唯一可靠路径。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

前端

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2623

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5703

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6690

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6378

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

903

5

html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

6535

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3652

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3330

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3339

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程