首页 > 解决方案 > 使用视图模型上的属性进行 MVC 排序

问题描述

假设我有一个用于呈现表格的列表视图的视图模型。

查看型号:

  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"})

标签: c#asp.net-mvc

解决方案


将表格标题更改为

<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()在查询中使用 a ,例如

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

您可能还希望呈现一个视觉指示器(例如向上或向下箭头)以向用户指示当前的排序顺序。


推荐阅读