MVC使用带有EditorFor的自定义索引器

时间:2015-02-26 14:37:18

标签: asp.net-mvc templates razor editorfor editorformodel

我有一个EditorFor模板,我用一组项目调用(可能有一些)并且我单独引用索引(不是循环)所以我可以用某种方式将它们放置

  

@ Html.EditorFor(x => Model.SomeViewModels [0],“SomeTemplate”)

一切正常,但理想情况下我想通过更好的索引器引用数组

  

@ Html.EditorFor(x => Model.SomeViewModels [“要查找的项目”],“SomeTemplate”)

为了更好的可读性,以及在索引发生变化时应对的一些灵活性 所以我想知道我是否可以在模型上设置自定义索引器 - 就像这样

    public ObjecToReturn this[string TextToFind]
    {
        get
        {
                          return ObjectToReturn based on TextToFind
        }
    }

并且它确实有效 - 并正确地提取值但是当我查看Html时,输入字段都有name=[Item to Find].AnswerValue之类的名称,我可以看到为什么但是它会混淆帖子

只是想知道是否有任何聪明的人知道如何将Model.SomeViewModels["Item to Find"]发送给编辑器。但模板中的基础Html反映了Model.SomeViewModels[0](0是“待查找的项目”的索引)数组)所以回发工作

或者这可能是错误的做法 - 我希望我能错过一些简单明了的事情。

提前致谢

1 个答案:

答案 0 :(得分:1)

默认情况下,DefaultModelBinder绑定索引器从零开始并且是连续的集合。您可以通过为Index属性添加隐藏输入来完成此工作(注意Index不是模型的属性 - 它只是用于绑定集合的特殊值)。例如

<input type="text" name="SomeViewModels[ABC]" value = "" />
<input type="hidden" name="SomeViewModels.Index" value="ABC" />

<input type="text" name="SomeViewModels[XYZ]" value = "" />
<input type="hidden" name="SomeViewModels.Index" value="XYZ" />

添加value属性与索引器值匹配的隐藏输入允许DefaultModelBinder正确绑定集合