MVC ASP.NET 复选框列表.我无法将数据检索到 IEnumerable 或列表
本文关键字:列表 检索 数据 IEnumerable NET ASP 复选框 MVC | 更新日期: 2023-09-27 17:56:51
我在使用 ASP.NET MVC 4 的应用程序时遇到问题,我正在尝试在视图中显示以创建一个名为 CompositePiece 的实体,一个项目列表(也是 CompositePieces)从我的数据库中,然后,用户可以选择其中的一个或多个,并且选择的项目将位于"父亲"CompositePiece 的集合中, 起初,我的类复合件:
namespace Garbi.Models{
public class CompositePiece
{
[Key]
public int CompositePieceId { get; set; }
[Required(ErrorMessage = "Introduzca un nombre para la pieza")]
[Display(Name = "Nombre de la pieza")]
public string CompositePieceName { get; set; }
public virtual ICollection<CompositePiece> Components { get; set; }
public int ProcessId { get; set; }
public int LevelOfHierarchy { get; set; }
public CompositePiece(PieceModel model)
{
this.Components = new List<CompositePiece>();
this.CompositePieceName = model.PieceModelName;
LevelOfHierarchy = 0;
}
public CompositePiece()
{
this.Components = new List<CompositePiece>();
LevelOfHierarchy = 0;
}
public CreateOrEditCompositePieceViewModel ToCreateOrEditCompositePieceViewModel(string processName)
{
return new CreateOrEditCompositePieceViewModel
{
CompositePieceName = this.CompositePieceName,
ProcessId = this.ProcessId,
ProcessName = processName
};
}
}
}
我创建了一个视图模型来将数据传递给视图,视图模型是:
namespace Garbi.ViewModels.CompositePieces
{
public class CreateOrEditCompositePieceViewModel
{
[Required(ErrorMessage = "Introduzca un nombre para la pieza")]
[Display(Name = "Nombre de la pieza")]
public string CompositePieceName { get; set; }
public virtual IEnumerable<SelectListItem> Components { get; set; }
public string[] SelectedComponentsId { get; set; }
public int ProcessId { get; set; }
public string ProcessName { get; set; }
public int LevelOfHierarchy { get; set; }
public void AddComponentsList(IEnumerable<CompositePiece> dataProvider, CompositePiece fatherPiece)
{
List<SelectListItem> auxList = new List<SelectListItem>();
foreach (CompositePiece piece in dataProvider)
{
SelectListItem item = new SelectListItem
{
Text=piece.CompositePieceName,
Value = piece.CompositePieceId.ToString(),
Selected = fatherPiece.Components.Contains(piece)
};
auxList.Add(item);
}
Components = new List<SelectListItem>(auxList);
}
public CompositePiece ToCompositePiece()
{
return new CompositePiece
{
CompositePieceName = this.CompositePieceName,
LevelOfHierarchy = this.LevelOfHierarchy,
ProcessId = this.ProcessId
};
}
}
}
小米视图是:
@model Garbi.ViewModels.CompositePieces.CreateOrEditCompositePieceViewModel
@{
ViewBag.Title = "Crear pieza compuesta";
}
<div class="advertise">Crear pieza compuesta para @Model.ProcessName</div>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Nueva pieza compuesta</legend>
<div class="editor-label">
@Html.LabelFor(model => model.CompositePieceName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.CompositePieceName)
@Html.ValidationMessageFor(model => model.CompositePieceName)
</div>
<div class="editor-field">
@foreach (var item in Model.Components)
{
<div class="checkbox">
@Html.CheckBoxFor(i => item.Selected, item.Value)
@Html.HiddenFor(i => item.Value)
@item.Text
@Html.HiddenFor(i => item)
</div>
}
</div>
@Html.HiddenFor(model => model.Components)
@Html.HiddenFor(model => model.LevelOfHierarchy)
@Html.HiddenFor(model => model.ProcessId)
@Html.HiddenFor(model => model.ProcessName)
<p>
<input type="submit" value="Crear" />
</p>
</fieldset>
<div class="back">
@Html.NavLink("Process_"+@Model.ProcessId, "Page1", "Volver")
</div>
}
最后,我想向您展示我的控制器的方法,它们是:
public ActionResult ComposePieces(int processId)
{
context = new EFDbContext();
Process process = context.ProcessesPaginable.FindEntityById(processId);
CreateOrEditCompositePieceViewModel model = new CreateOrEditCompositePieceViewModel
{
ProcessId = process.ProcessId,
ProcessName = process.ProcessName,
LevelOfHierarchy = 0
};
IEnumerable<CompositePiece> totalPieces = context.CompositePiecesPaginable.FindAllCompositePiecesOfAProcess(processId).Where(p => p.LevelOfHierarchy == 0);
model.AddComponentsList(totalPieces, model.ToCompositePiece());
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ComposePieces(CreateOrEditCompositePieceViewModel model)
{
context = new EFDbContext();
CompositePiece compositePieceToAdd = model.ToCompositePiece();
CompositePiece aux;
[...]
}
当我调用视图时,我的问题来了,我可以完美地看到项目的集合,每个项目都有其复选框,但是当我选中其中一些,输入 CompositePiece 的名称并单击提交按钮时,我恢复了新的 CreateOrEditCompositePieceViewModel 及其新名称,但我的属性组件是空的。我想我有一个基础错误,但我不知道错误在哪里,为什么我有这个问题。
谢谢你的时间,对不起我的英语不好。
我也和你有同样的问题。
当我收到回发时,导航属性没有返回,甚至认为我在窗体上选择了它们,或者隐藏了它们。
我认为这个问题与属性是虚拟的有关,因此它使用延迟加载。
我尝试过的一件事显示出有希望,但仍然^没有完成工作,如果你添加:
@Html.HiddenFor(model => Model.Components);
在你的 foreach 循环之前。发生的情况是,当您查看回发时,您会在那里找到组件,它不再为空,但列表仍将为空,但我认为解决方案是在这个方向上。
无论如何,够了。我即将做一个应该可行的解决方法。你做什么,你创建一个视图模型与您的班级加上每个虚拟列表的列表
像这样:
public class MyViewModel
{
public MyModelView(CompositePiece cp)
{
CompositePiece = cp;
Components = cp.Components.ToList();
}
public CompositePiece CompositePiece { get; set; }
public List<Component> Components { get; set; }
}
我刚刚看到在你的类上你创建了一个自己的列表,你可能不应该这样做。这不是您在 C# 中创建链表的方式
因此,如果您确实喜欢此示例,则将创建虚拟列表的实例,这应该可以解决问题。
祝你好运。