Сортировка вложенных коллекций с помощью EditorFor

#asp.net-mvc-3 #razor #editorfor

#asp.net-mvc-3 #razor #editorfor

Вопрос:

Я использую общие шаблоны редактора для отображения вложенных коллекций в моем представлении с помощью HTML-помощника EditorFor, аналогичного следующему. Я не в восторге от всех этих вложенных частичных представлений, но, выполняя это таким образом, элементы присваивают соответствующие имена, чтобы они отправлялись обратно на мой контроллер в ViewModel без проблем.

Как бы я отсортировал порядок на самом решительном уровне гнезда? В этом случае, как бы мне заставить «Budget.vbhtml» отображаться в порядке убывания по годам?

Заранее спасибо!

Представление верхнего уровня (Organization.vbhtml):

 <div id="budgets">
     @Html.EditorFor(Function(org) org.OrganizationBudgets))
</div>
  

Организационный бюджет.vbhtml:

 @ModelType CharityMVC.OrganizationBudget
@Html.EditorFor(Function(ob) ob.Budget)
  

Budget.vbhtml:

 @ModelType CharityMVC.Budget
@Model.Year @Html.EditorFor(Function(b) b.Amount)
  

Обновить:

Похоже, что я должен делать это в своем контроллере при заполнении объекта моей модели, но как мне отсортировать дочерние элементы или дочерние элементы дочерних элементов в запросе linq? Это мой текущий код:

 Function Edit(ByVal id As Integer) As ActionResult
    Dim o As Organization
    Dim ovm As OrganizationViewModel

    'Load the organization from the database
    o = (From org In _db.Organizations _
        Where org.Id = id _
        Select org).FirstOrDefault()

    'Map it to the ViewModel
    ovm = AutoMapper.Mapper.Map(Of Organization, OrganizationViewModel)(o)

    Return View(ovm)

End Function
  

Комментарии:

1. Пара мыслей, которые у меня были, но я не уверен, как их реализовать: используйте DataAnnotations для указания порядка сортировки. Примените сортировку в Automapper, который сопоставляется с моей ViewModel.

Ответ №1:

Мой лучший ответ на данный момент:

Множество запросов LINQ, заполняющих дочерние свойства следующим образом:

 Function Edit(ByVal id As Integer) As ActionResult
    Dim o As Organization
    Dim ovm As OrganizationViewModel

    'Load the organization from the database
    o = (From org In _db.Organizations _
        Where org.Id = id _
        Select org).FirstOrDefault()

    o.OrganizationBudgets = (From ob In _db.OrganizationBudgets _
                             Where ob.OrganizationId = o.Id _
                             Order By ob.Budget.Year Descending _
                             Select ob).ToList()


    'Map it to the ViewModel
    ovm = AutoMapper.Mapper.Map(Of Organization, OrganizationViewModel)(o)

    Return View(ovm)

End Function