2

我刚刚注册了,这是我的第一篇文章,所以如果问题不是最好的,请耐心等待。我看了一下,找不到符合我要求的答案;这可能是因为它不可能实现我想要的。MVC OrderBy EditorFor IEnumerable

我有通过从一个视图模型EditorFor字段的IEnumerable列表拉动的部分视图:

@model DocumentViewModelContainer 
@Html.EditorFor(m => m.Document.Metadata) 

的DocumentViewModelContainer有以下代码:

public class DocumentViewModelContainer 
{ 
    public DocumentViewModel Document 
    { 
     get; 
     set; 
    } 

的DocumentViewModel有以下代码:

public class DocumentViewModel 
{ 
    public IEnumerable<DocumentMetadataFieldViewModel> Metadata 
     { 
      get; 
      set; 
     } 
} 

有一吨博其他对象这是我在这个问题中被遗漏的无关模型。 DocumentMetadataFieldViewModel由标准类型(int,字符串等)的几个字段组成

我想要实现的是将一个OrderBy添加到此列表中,通过在底部视图模型中的对象排序后退如下:

@model DocumentViewModelContainer 
@Html.EditorFor(m => m.Document.Metadata.OrderBy(i => i.InstanceFieldOrder)) 

然而,这给出了错误:

System.InvalidOperationException : Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions. 

我不仅很新的MVC,但是C#一般;这个项目让我学习上飞的语言,所以请发挥不错:)

感谢,

马克

回答

5

你应该在你的控制器动作完成此排序负责检索您的视图模型并将它们传递给视图。

你总是可以在您的视图执行以下恐怖:

@model DocumentViewModelContainer 
@{ 
    Model.Document.Metadata = Document.Metadata.OrderBy(i => i.InstanceFieldOrder).ToList(); 
} 
@Html.EditorFor(m => m.Document.Metadata) 

但答应我,你不会那样做。

+0

噢,但是你的解决方案工作得很好,如果我已经检查过!!我是一个坏人吗? :) Model.Document.Metadata = Model.Document.Metadata.OrderBy(i => i.InstanceMetadataTemplateId).ThenBy(i => i.InstanceFieldOrder).ToList(); – Mark 2012-03-16 15:02:24

+0

忘了提及 - 感谢您的快速和准确的反应! :) – Mark 2012-03-16 15:07:47