拆分MVC EditorFor用于实体列表

本文关键字:实体 列表 用于 EditorFor MVC 拆分 | 更新日期: 2023-09-27 18:13:22

嗨,我试图使一个应用程序,你可以创建事件注册等形式。我有一个表单模型,它有一个字段集合。Fields是抽象的,派生了Checkbox或TextInput之类的东西。我已经得到了它,所以多态行为是为我的字段列表工作,我可以得到每种字段的EditorFor模板,这样我就可以在整个列表上做EditorFor,它将生成具有正确模板的列表。

这是伟大的,非常容易与实体框架,但我的问题是,我希望能够做一些渲染逻辑之间的每个字段,呈现在屏幕上。字段应该呈现为行/列网格,每个字段都具有row/Size属性。我知道如何在字段列表上使用EditorFor模板的唯一方法是这样的

<div class="row">
    @Html.EditorFor(form => form.Fields)
</div>

但是我需要能够有某种循环,而不是我可以控制模板在哪里被渲染。例如,它们是按行排序的,所以我可以检查我们是否还在向同一行添加字段,或者我是否需要创建一个新行。

如果我必须在明天之前解决这个问题,我就把它渲染成静态htmldiv,然后使用jQuery移动它,但我觉得这是一个糟糕的方法。另一种方法是将当前行存储在Viewbag中,但对于每个字段的模板(如12),我只是复制相同的逻辑代码…

拆分MVC EditorFor用于实体列表

EditorFor使用存储在Views/Shared/EditorTemplates中的模板。您可以在那里为您的类型定义自己的模板或覆盖现有的模板。检查这个repo:https://github.com/danmalcolm/mvc-razor-display-and-editor-templates/tree/master/src/DemoMvcApp/Views/Shared/EditorTemplates

我认为在你的情况下,你想要重写Object.cshtml像:https://github.com/danmalcolm/mvc-razor-display-and-editor-templates/blob/master/src/DemoMvcApp/Views/Shared/EditorTemplates/Object.cshtml我说的对吗?

我的临时解决方案只是在我的主视图中循环行。我将当前行索引存储在ViewBag中,然后在编辑器模板中检查模型。Row == ViewBag.CurrRow。我真的不喜欢这样,因为我将遍历所有的模板,为我拥有的每一行字段。

我认为永久的解决方案将是一个自定义的ViewModel,它将字段分成行,这样我就可以为每行设置一个编辑器模板。

我也刚刚发现EditorFor调用模型。Fields实际上并不是在所有字段上调用EditorFor,而是在iccollection类型上调用它,后者反过来调用Field Editor模板。所以我很确定我可以让我自己的icollectioneditortemplate有行逻辑我需要。