为包含复杂对象列表的复杂对象制作编辑器表单

我正在开发一个 MVC 项目,在该项目中,我试图在将其提交到数据库之前检查已由控制器处理的复杂对象列表。问题的关键在于两个部分。


首先,视图显示每个对象,并带有“保留此”复选框(即:此对象适合添加)


其次,复杂对象都来自一个源 - 但每个复杂对象列表可以有多个源。我还需要为每个源显示一个复选框,每个源仅显示一次,表示不同的标志(不保留,但如果源完整或仅部分)


因为这是关于程序生成的地图,所以有两件事是:


地图图块列表(复杂对象的列表) - 每个图块都有一个复选框,如果我们保留它以添加到数据库,或者忽略它。地图标识符(源)- 每次运行都有一个复选框,指示我们是否知道这些是本次运行的所有图块,还是只有少数图块。


到目前为止我是如何解决这个问题的:


在我看来,当我不担心区分源时,我使用了 EditorForModel。这对于让复选框返回到帖子中非常有用


<form asp-controller="Process" asp-action="Keep" method="post">



    <input type="submit" value="Submit Data" id="btnSubmit" />

    <hr />


    @Html.EditorForModel()


    <input type="submit" value="Submit Data" id="btnSubmit" />

    <hr />

</form>

带有原始模型的模板,即地图的每个图块。这并没有区分地图 - 我只是将所有图块(无论它们来自哪个地图)以单个列表的形式传递给视图。这非常有效,我的后期操作将不同的地图分开来单独处理每个地图及其图块。


观点基本上是:


- Tile 1 CheckBox: Keep[]?

- Tile 2 CheckBox: Keep[]?

- Tile 3 CheckBox: Keep[]?

... and so on

不关心它们来自哪张地图。地图信息仍然存在(它位于每个图块对象上),我只是在“发布”操作中对其进行处理,以将它们正确地分离到地图中。


但现在,我想添加判断给定地图的图块列表是否完整的功能。我的目标是一个复选框 - 看起来像这样:


Map Identifier map1  CheckBox: Complete? []

 - Tile 1 for map1    CheckBox: Keep[]?

 - Tile 2 for map1    CheckBox: Keep[]?

 - ... and so on

Map Identifier map2  CheckBox: Complete? []

 -Tile 1 for map2     CheckBox: Keep[]?

 - ... ect

我不知道每次处理尝试会有多少个图块或地图。


所以我试图做的是创建一个新的 ViewModel :


    public class MultipleMapIdentifiers

    {

        [Display(Name = "Map: ")]

        public string MapIdentifier { get; set; }

        public List<TileInformation> TileInformationList{ get; set; }


        [Display(Name = "Full Run? ")]

        public bool FullRun { get; set; }

    }

然后,在返回 Review 视图之前,我只需浏览所有提交的图块,获取不同的 MapIdentifier,然后循环遍历图块以查找具有相同 mapID 的图块,并将它们一起放入此视图对象中的列表中。


然后我使用新的编辑器模板创建了新视图。


起初,我只是在 MultipleMapIdentifiers EditorTemplate 中使用 @foreach 循环来显示每个图块。让他们表现得很棒。调用 Post 时返回空列表。


其次,我尝试为每个项目调用部分视图 - 仍然是 MultipleMapsIdentifiers EditorTemplate 中的 Foreach 循环,但它调用了我希望能够正常用于编辑器复选框的 TileInformation 模板。请记住 - 如果我们想要保留此图块或将其作为坏/重复图块丢弃,则每个图块信息都有其自己的复选框。


这也只向发布操作返回空的图块列表。


有没有办法做到这一点,我所希望的?如何获取带有复选框的列表,将其完整返回到“发布操作”,以便我可以在添加到数据库之前删除我们不想保留的列表?


HUX布斯
浏览 124回答 1
1回答

拉风的咖菲猫

如果有人正在搜索并降落在这里:我最终向通用模型添加了几个 [NotMapped] 属性,首先包括一个 bool 属性。如果第一个标志为 true,则它会显示地图标识符字符串和其他任何内容,否则它仅使用 razor 中的隐藏字段来推送其余模型版本的数据。@if (Model.First){&nbsp; &nbsp; <div class="row mb-3 bg-info rounded">&nbsp; &nbsp; &nbsp; &nbsp; <div class="col-sm-2 font-weight-bold border-bottom border-light mb-2 align-items-center">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Html.DisplayNameFor(a => a.MapIdentifier)&nbsp; &nbsp; &nbsp; &nbsp; </div>&nbsp; &nbsp; &nbsp; &nbsp; <div class="col-sm-7 font-italic text-truncate border-bottom border-light mb-2 align-items-center">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <div class="display-field">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Html.DisplayFor(a => a.MapIdentifier)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <div class="editor-field">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Html.HiddenFor(a => a.MapIdentifier)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Html.ValidationMessageFor(a => a.MapIdentifier)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>&nbsp; &nbsp; &nbsp; &nbsp; </div>&nbsp; &nbsp; &nbsp; &nbsp; <div class="col-sm-3 border-bottom border-light mb-2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <p class="text-center"><span>@Html.CheckBoxFor(a => a.FullRun)</span>&nbsp; <b>Was this a Complete Run?</b></p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <p class="text-center"><span>@Html.CheckBoxFor(a => a.MapPointsRecorded)</span>&nbsp; <b>Recording Map Points?</b></p>&nbsp; &nbsp; &nbsp; &nbsp; </div>&nbsp; &nbsp; &nbsp; &nbsp; <div class="editor-field">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Html.HiddenFor(a => a.First)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Html.ValidationMessageFor(a => a.First)&nbsp; &nbsp; &nbsp; &nbsp; </div>&nbsp; &nbsp; </div>}else{&nbsp; &nbsp; <div class="editor-field">&nbsp; &nbsp; &nbsp; &nbsp; @Html.HiddenFor(a => a.MapIdentifier)&nbsp; &nbsp; &nbsp; &nbsp; @Html.ValidationMessageFor(a => a.MapIdentifier)&nbsp; &nbsp; </div>}可能不是最优雅的解决方案,但它目前有效。
打开App,查看更多内容
随时随地看视频慕课网APP