从文件夹中获取文件,然后在foreach循环中添加复选框和ID并显示——问题
我把自己搞得有点乱,尝试了太多东西。我可能让事情变得过于复杂。这个功能位于一个大型后台管理面板项目中,我们使用HTML助手而不是WinForms,因此是cshtml文件。
必需的步骤:
从文件夹读取 - 示例(不是实际文件夹)@\"C:\Import\" - 这部分可以正常工作
遍历该文件夹中的文件列表,以使用ImageCount作为ID、ImageName作为图片名称、isChecked设置为False来填充CheckBox列表。稍后我将添加删除功能。
我见过一些很棒的实现示例,但不是使用HTML助手,或者是作为新项目的示例,这些都不适合这个项目。
问题:
这个示例在控制器代码中对某些文件名进行硬编码时可以工作,但现在我改用文件夹中的文件列表,我自己把事情搞糊涂了。
当前它会遍历文件夹中的所有文件并覆盖每个条目,最终只显示该文件夹中最后一个图片条目:
我相信我是用每次都使用 'new' 重置它?或者是向列表添加的方式不起作用,还是我的循环完全错了。
foreach (FileInfo i in Files)
{
count++;
List<CheckBoxModel> ChkItem = new List<CheckBoxModel>()
{
new CheckBoxModel { ImageCount = count, ImageName = i.Name, IsChecked = false }
};
ChkItems.CheckBoxItems = ChkItem;
}
All Code:
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; }
}
}
Controller
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()
{
//Creating object of CheckBoxList model class
CheckBoxList ChkItems = new CheckBoxList();
DirectoryInfo dinfo = new DirectoryInfo(@"C:\Import");
FileInfo[] Files = dinfo.GetFiles();
int count = 0;
foreach (FileInfo i in Files)
{
count++;
List<CheckBoxModel> ChkItem = new List<CheckBoxModel>()
{
new CheckBoxModel { ImageCount = count, ImageName = i.Name, IsChecked = false }
};
//assigning records to the CheckBoxItems list
ChkItems.CheckBoxItems = ChkItem;
}
return View(ChkItems);
}
}
}
CSHTML
@model xxxx.xxxx.CMS.Models.CheckBoxList
<div class="form-horizontal">
<h4>Select Images to Delete</h4>
@foreach (var item in Model.CheckBoxItems)
{
<input [email protected]
type="checkbox"
checked="@item.IsChecked" />
@item.ImageName<br />
}
</div>
解决方案
在列表的每次迭代中,你把该属性设为指向一个新的、只有一个项的列表。因此在循环结束时,你的 CheckBoxItems 属性将指向包含你创建的最后一个 CheckBoxModel 实例的单项列表。
相反,我希望只创建一个列表,在循环的迭代中填充它,然后在循环结束后再把它赋值给该属性:
var models = nnew List<CheckBoxModel>();
foreach (FileInfo file in Files)
{
var model = new CheckBoxModel
{
ImageCount = models.Count + 1,
ImageName = file.Name,
IsChecked = false
};
models.Add(model);
}
ChkItems.CheckBoxItems = models;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。