MVC сортировка со свойством на View Model - PullRequest
0 голосов
/ 14 мая 2018

Скажем, у меня есть модель представления для представления списка, которое отображает таблицу

Просмотр модели:

  public class SortModel
  {
     public List<Document> Documents {get;set;}
     public string SortParameter {get;set;}
     public string SortOrder {get;set;}
  }

  public class Document
  {
     public string Name {get;set;}
     public int Age {get;set;}
  }     

Вид:

   <th>@Html.DisplayNameFor(model => model.Documents[0].Name)</th>
   <th>@Html.DisplayNameFor(model => model.Documents[0].Age)</th>

Контроллер:

public ActionResult Index(SortModel model)
{
   var docs = db.GetDocs();
   if(model.SortParameter == "Age" && model.SortOrder == "desc")
   {
      docs.OrderByDescending(x => x.Age);
   }  
   return View(model); 
}

Как я могу сделать представление так, чтобы заголовки таблиц были кликабельными и обновляли модель перед публикацией? Я хочу избежать использования ViewBag.

Полагаю, мне нужно будет использовать ActionLink, но я не уверен, как обновить модель перед публикацией.

Что-то вроде:

<th>@Html.ActionLink("Index", "Home", "Name", new { Model.SortParameter = "Name", Model.SortOrder = "Desc"})

1 Ответ

0 голосов
/ 14 мая 2018

Измените заголовки таблицы на

<th>@Html.ActionLink("Name", "Index", "Home", new { SortParameter = "Name", SortOrder = Model.SortOrder }, null)</th>
<th>@Html.ActionLink("Name", "Index", "Home", new { SortParameter = "Age", SortOrder = Model.SortOrder }, null)</th>

, а затем измените метод контроллера для переключения SortOrder

public ActionResult Index(SortModel model)
{
   var docs = db.GetDocs();
   if(model.SortParameter == "Age" && model.SortOrder == "desc")
   {
      docs.OrderByDescending(x => x.Age);
      model.SortOrder == "acs"
   }  
   return View(model); 
}

Обратите внимание, что, вероятно, было бы проще, если бы у вас был bool IsAscending свойство, а не string SortOrder.

Однако у вас есть только одно свойство 'SortOrder', поэтому, если текущее представление отображает документы, отсортированные по Name в порядке возрастания, и пользователь нажимает Age, то документы будут отсортированы по Age в порядке возрастания.Если пользователь затем нажимает на Name, Документы будут отсортированы по Name в порядке убывания.Вы не указали, почему требуется такое поведение, но вы могли бы добавить несколько свойств 'SortOrder', скажем

public bool IsNameAscending { get; set; }
public bool IsAgeAscending { get; set; }

, чтобы справиться с этим, а также позволить вам использовать .ThenBy() в вашем запросе, дляпример

docs.OrderBy(x => x.Age).ThenBy(x=> x.Name);

Вы также можете визуализировать визуальный индикатор (например, стрелки вверх или вниз), чтобы указать текущий порядок сортировки для пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...