model-view-controller - 对不在数据库 MVC 中的列进行排序
问题描述
我正在尝试获取实际上不在数据库中的列的升序/降序排序。
模型:
public int? Stewardship { get; set; }
[Range(0, 50, ErrorMessage = "Enter number between 0 and 50")]
public int? Culture { get; set; }
[Range(0, 50, ErrorMessage = "Enter number between 0 and 50")]
[Display(Name = "Delivery Excellence")]
public int? Delivery_Excellence { get; set; }
[Range(0, 50, ErrorMessage = "Enter number between 0 and 50")]
public int? Innovation { get; set; }
[Range(0, 50, ErrorMessage = "Enter number between 0 and 50")]
[Display(Name = "Greater Good")]
public int? Greater_Good { get; set; }
[Range(0, 50, ErrorMessage = "Enter number between 0 and 50")]
[Display(Name = "Integrity and Openness")]
public int? Integrity_And_Openness { get; set; }
[Range(0, 50, ErrorMessage = "Enter number between 0 and 50")]
public int? Balance { get; set; }
[Range(0, 50, ErrorMessage = "Enter number between 0 and 50")]
[Display(Name = "Total Points")]
public int? TotalPoints
{
get
{
return Stewardship + Culture + Delivery_Excellence + Innovation + Greater_Good + Integrity_And_Openness + Balance;
}
}
控制器:
public ActionResult Index(string sortOrder)
{
//https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application
//ViewBag.TotalSortParm = String.IsNullOrEmpty(sortOrder) ? "total_desc" : "";
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.StewardshipSortParm = sortOrder == "Stewardship" ? "stewardship_desc" : "Stewardship";
ViewBag.CultureSortParm = sortOrder == "Culture" ? "culture_desc" : "Culture";
ViewBag.DeliverySortParm = sortOrder == "Delivery Excellence" ? "delivery_excellence_desc" : "Delivery Excellence";
ViewBag.InnovationSortParm = sortOrder == "Innovation" ? "innovation_desc" : "Innovation";
ViewBag.GreaterSortParm = sortOrder == "Greater Good" ? "greater_good_desc" : "Greater Good";
ViewBag.IntegritySortParm = sortOrder == "Integrity And Openness" ? "integrity_desc" : "Integrity And Openness";
ViewBag.BalanceSortParm = sortOrder == "Balance" ? "balance_desc" : "Balance";
//ViewBag.NameSortParm = sortOrder == "Name" ? "name_desc" : "Name";
var leaderboard = from s in db.Users
select s;
switch (sortOrder)
{
//case "total_desc":
// leaderboard = leaderboard.OrderByDescending(s => s.TotalPoints);
// break;
case "name_desc":
leaderboard = leaderboard.OrderByDescending(s => s.UserDetails.firstName);
break;
case "Stewardship":
leaderboard = leaderboard.OrderBy(s => s.Stewardship);
break;
case "stewardship_desc":
leaderboard = leaderboard.OrderByDescending(s => s.Stewardship);
break;
case "Culture":
leaderboard = leaderboard.OrderBy(s => s.Culture);
break;
case "culture_desc":
leaderboard = leaderboard.OrderByDescending(s => s.Culture);
break;
case "Delivery Excellence":
leaderboard = leaderboard.OrderBy(s => s.Delivery_Excellence);
break;
case "delivery_excellence_desc":
leaderboard = leaderboard.OrderByDescending(s => s.Delivery_Excellence);
break;
case "Innovation":
leaderboard = leaderboard.OrderBy(s => s.Innovation);
break;
case "innovation_desc":
leaderboard = leaderboard.OrderByDescending(s => s.Innovation);
break;
case "Greater Good":
leaderboard = leaderboard.OrderBy(s => s.Greater_Good);
break;
case "greater_good_desc":
leaderboard = leaderboard.OrderByDescending(s => s.Greater_Good);
break;
case "Integrity And Openness":
leaderboard = leaderboard.OrderBy(s => s.Integrity_And_Openness);
break;
case "integrity_desc":
leaderboard = leaderboard.OrderByDescending(s => s.Integrity_And_Openness);
break;
case "Balance":
leaderboard = leaderboard.OrderBy(s => s.Balance);
break;
case "balance_desc":
leaderboard = leaderboard.OrderByDescending(s => s.Balance);
break;
case "Name":
leaderboard = leaderboard.OrderBy(s => s.UserDetails.firstName);
break;
default:
leaderboard = leaderboard.OrderBy(s => s.UserDetails.firstName);
break;
}
return View(leaderboard.ToList());
}
指数:
<table class="table">
<tr>
<th>
@Html.ActionLink("Name", "Index", new { sortOrder = ViewBag.NameSortParm })
</th>
<th>
@Html.ActionLink("Stewardship", "Index", new { sortOrder = ViewBag.StewardshipSortParm })
</th>
<th>
@Html.ActionLink("Culture", "Index", new { sortOrder = ViewBag.CultureSortParm })
</th>
<th>
@Html.ActionLink("Delivery Excellence", "Index", new { sortOrder = ViewBag.DeliverySortParm })
</th>
<th>
@Html.ActionLink("Innovation", "Index", new { sortOrder = ViewBag.InnovationSortParm })
</th>
<th>
@Html.ActionLink("Greater Good", "Index", new { sortOrder = ViewBag.GreaterSortParm })
</th>
<th>
@Html.ActionLink("Integrity And Openness", "Index", new { sortOrder = ViewBag.IntegritySortParm })
</th>
<th>
@Html.ActionLink("Balance", "Index", new { sortOrder = ViewBag.BalanceSortParm })
</th>
<th>
@Html.DisplayNameFor(model => model.TotalPoints)
</th>
</tr>
我基本上希望能够使用表头中的链接对每个字段进行排序,这适用于模型/数据库中实际存在的所有内容,但是由于 TotalPoints 列不在实际的 SQL 数据库中,因此出现 LINQ 错误,它试图对控制器中的总点进行排序的注释掉的部分是我遇到问题的地方。