2

Я только что зарегистрировался, и это мой первый пост, поэтому, пожалуйста, несите меня, если вопрос не самый лучший. Я посмотрел и не могу найти ответ, который соответствует моим требованиям; это возможно потому, что невозможно достичь того, чего я хочу.MVC OrderBy EditorFor IEnumerable

У меня есть частичный вид, который втягивает через IEnumerable список полей EditorFor из ViewModel:

@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

+0

Забыл упомянуть - Спасибо, кстати, за быстрый и точный ответ! :) – Mark