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 及其新名称,但我的属性组件是空的。我想我有一个基础错误,但我不知道错误在哪里,为什么我有这个问题。

谢谢你的时间,对不起我的英语不好。

MVC ASP.NET 复选框列表.我无法将数据检索到 IEnumerable 或列表

我也和你有同样的问题。

当我收到回发时,导航属性没有返回,甚至认为我在窗体上选择了它们,或者隐藏了它们。

我认为这个问题与属性是虚拟的有关,因此它使用延迟加载。

我尝试过的一件事显示出有希望,但仍然^没有完成工作,如果你添加:

@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# 中创建链表的方式

因此,如果您确实喜欢此示例,则将创建虚拟列表的实例,这应该可以解决问题。

祝你好运。