拆分MVC EditorFor以获取实体列表

时间:2014-07-18 02:47:58

标签: c# asp.net asp.net-mvc razor

您好我正在尝试创建一个应用程序,您可以在其中创建事件注册等表单。我有一个Form模型,其中有一个ICollection of Fields。 Fields是抽象的,并且派生诸如Checkbox或TextInput之类的东西。我已经得到它所以多态行为适用于我的字段列表,我可以获得每种字段的EditorFor模板,以便我可以在整个列表上执行EditorFor,它将生成具有正确模板的列表。

这对于实体框架来说非常简单,但我的问题是我希望能够在屏幕上呈现的每个字段之间进行一些渲染逻辑。字段应该呈现为行/列网格,每个字段具有行/大小属性。 我已经弄清楚如何在字段列表中使用EditorFor模板的唯一方法就是这样

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

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

如果明天我必须解决这个问题,我只需将其渲染为静态html div,然后使用jQuery移动它,但我觉得这是一种可怕的方式。另一种方法是将当前行存储在Viewbag中,然后存储每个Field的模板(如12)我只是复制相同的逻辑代码......

任何更好的想法都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

EditorFor使用存储在Views / Shared / EditorTemplates中的Tampletes。您可以为您的类型定义自己的tamplates或覆盖现有的。 检查这个回购: 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 我是对的吗?

答案 1 :(得分:0)

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

我认为永久解决方案将是一个自定义的ViewModel,它将Fields拆分为Rows,因此我可以为每一行创建一个Editor模板。

我还发现,对Model.Fields的EditorFor调用实际上并没有在所有字段上调用EditorFor,而是在ICollection类型上调用它,而ICollection类型又调用了Field Editor模板。所以我很确定我可以创建自己的ICollection EditorTemplate,它具有我需要的Row逻辑。