【问题标题】:MVC Using a custom indexer with a EditorForMVC 使用带有 EditorFor 的自定义索引器
【发布时间】:2015-02-26 14:37:17
【问题描述】:

我有一个 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"] 发送到 EditorFor 但模板中的底层 Html 反映了Model.SomeViewModels[0](0 是数组中“要查找的项目”的索引)所以回发工作

或者也许这是错误的方法 - 我希望我遗漏了一些简单的东西。

提前致谢

【问题讨论】:

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


    【解决方案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 正确绑定集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多