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