Если значения статуса являются фиксированными, один из вариантов - изменить вашу ViewModel так, чтобы она содержала два списка членов - один для активных и другой для неактивных.
Независимо от того, сохраняете ли вы комбинированный список или нет, вы можете использовать пользовательский шаблон отображения для рендеринга фактического члена.Это позволит сохранить вид чистым и позволит вам добавлять будущие обновления дисплея в одном месте.
ОБНОВЛЕНИЕ:
Вот ссылка, которая показывает, как создавать шаблоны отображения, Для чего нужен синтаксис @ Html.DisplayFor?
В основном вы добавляете подпапку в соответствующую папку View (Home, Shared и т. Д.) С именем «DisplayTemplates».Создайте в этой папке ModelName.cshtml файлы с @model в качестве первой строки.С этого момента это стандартный Razor / Html, который вы бы поместили в свой цикл for.
Вы можете усложнить, если ваша ViewModel содержит Dictionary<string, List<MembersIndexViewModel>>
.Строковым ключом будет ваш статус, а значением будет список членов с таким статусом.
Я бы начал с DisplayTemplate, прежде чем заняться вложенным списком.
---- ОБНОВЛЕНИЕ 2: рабочий пример -----
Базовый объект для члена:
public class MemberViewModel
{
public string Status { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
/* ... other properties ... */
}
Модель представления для самой страницы, которая может содержать другие свойства при необходимости.:
public class MemberIndexViewModel
{
// view may need additional info outside of the status list
public string SomeOtherData { get; set; }
public Dictionary<string, List<MemberViewModel>> MembersByStatus { get; set; }
public MemberIndexViewModel()
{
MembersByStatus = new Dictionary<string, List<MemberViewModel>>();
}
}
Макетированная функция для возврата вашего списка членов:
private List<MemberViewModel> MockDataFromDB()
{
List<MemberViewModel> members = new List<MemberViewModel>();
for (var i = 0; i < 20; i++)
{
var m = new MemberViewModel();
if (i < 10)
m.Status = "Active";
else if (i < 15)
m.Status = "Inactive";
else
m.Status = "Unknown";
m.FirstName = "First" + i.ToString();
m.LastName = "Last" + i.ToString();
members.Add(m);
}
return members;
}
Действие контроллера, которое получает данные из базы данных и затем строит соответствующую модель представления, сортируя членов всоответствующий список:
[HttpGet]
public ActionResult Test3()
{
var members = MockDataFromDB(); // get the data from the DB
var vm = new MemberIndexViewModel();
vm.SomeOtherData = "Something else the view may need.";
foreach (var m in members)
{
if (!vm.MembersByStatus.ContainsKey(m.Status))
vm.MembersByStatus.Add(m.Status, new List<MemberViewModel>());
vm.MembersByStatus[m.Status].Add(m);
}
return View(vm);
}
Шаблон отображения для объекта-члена, расположенный в Views -> Home -> DisplayTemplates -> MemberViewModel.cshtml:
@model ViewModel.MemberViewModel
<div>@Model.FirstName @Model.LastName</div>
И, наконец,представление, которое связывает все это вместе:
@model ViewModel.MemberIndexViewModel
<span>SomeOtherData: </span><span class="display-field">@Html.DisplayFor(model => model.SomeOtherData)</span>
<hr />
@foreach (var group in Model.MembersByStatus)
{
<fieldset>
<legend>@group.Key</legend>
@Html.DisplayFor(m => group.Value)
</fieldset>
}
Это может быть излишним для вашего сценария, но, по крайней мере, вы можете увидеть, как это может работать.