读取文件夹文件生成复选框列表仅显示最后一项的问题
问题解决:ASP.NET MVC遍历文件夹生成复选框列表仅显示最后一项
问题背景
在ASP.NET MVC后台管理项目(使用CSHTML视图)中,需读取指定文件夹(如C:\Import)的文件,循环生成以ImageCount为ID、ImageName为显示名称、默认未勾选的复选框列表。此前硬编码文件名时功能正常,但改用文件夹文件列表后,遍历过程中每次循环都新建List<CheckBoxModel>并赋值给ChkItems.CheckBoxItems,导致最终仅显示最后一个文件的复选框。
问题原因
每次循环都创建新的List<CheckBoxModel>实例,并直接赋值给ChkItems.CheckBoxItems,这会覆盖之前的列表数据,最终仅保留最后一次循环生成的单元素列表。正确逻辑应为初始化空列表后,在循环中逐个添加元素,而非反复覆盖列表。
修正代码
1. Controller代码修正
修改DeleteFile方法,先初始化空列表,再在循环中添加元素:
using System.IO; using System.Web.Mvc; using xxxx.xxxx.CMS.Models; using System.Collections.Generic; namespace xxxx.xxxx.CMS.Controllers { public class DeleteController : Controller { // GET: Delete public ActionResult DeleteFile() { CheckBoxList ChkItems = new CheckBoxList(); // 初始化空列表 ChkItems.CheckBoxItems = new List<CheckBoxModel>(); DirectoryInfo dinfo = new DirectoryInfo(@"C:\Import"); FileInfo[] Files = dinfo.GetFiles(); int count = 0; foreach (FileInfo i in Files) { count++; // 向已有列表添加新元素 ChkItems.CheckBoxItems.Add(new CheckBoxModel { ImageCount = count, ImageName = i.Name, IsChecked = false }); } return View(ChkItems); } } }
2. CSHTML视图优化(可选)
原视图中checked="@item.IsChecked"会在值为false时渲染为checked="False",这会被HTML视为勾选状态,因此优化为条件渲染checked属性:
@model xxxx.xxxx.CMS.Models.CheckBoxList <div class="form-horizontal"> <h4>Select Images to Delete</h4> @foreach (var item in Model.CheckBoxItems) { <input id="@item.ImageCount" type="checkbox" @(item.IsChecked ? "checked" : "") /> @item.ImageName<br /> } </div>
3. Model代码(无需修改)
namespace xxxx.xxxx.CMS.Models { using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; public class CheckBoxModel { public int ImageCount { get; set; } public string ImageName { get; set; } public bool IsChecked { get; set; } } public class CheckBoxList { public List<CheckBoxModel> CheckBoxItems { get; set; } } }
内容的提问来源于stack exchange,提问作者playboxdesign
相关产品推荐
相关产品推荐

