C# 表中数据的排序和搜索不起作用
我遵循以下有关排序和搜索的教程: 当我尝试这样做时,排序不起作用。我想对3个字段进行排序,用户名、用户角色和注册日期。我显示的数据没有按任何顺序排序,只是显示数据。 谁能帮我一下我做错了什么C# 表中数据的排序和搜索不起作用,c#,linq,asp.net-mvc-4,sorting,search,C#,Linq,Asp.net Mvc 4,Sorting,Search,我遵循以下有关排序和搜索的教程: 当我尝试这样做时,排序不起作用。我想对3个字段进行排序,用户名、用户角色和注册日期。我显示的数据没有按任何顺序排序,只是显示数据。 谁能帮我一下我做错了什么 //controller code: public ActionResult DisplayUsers(string sortOrder, string searchString) { ViewBag.NameSortParm1 = String.IsNull
//controller code:
public ActionResult DisplayUsers(string sortOrder, string searchString)
{
ViewBag.NameSortParm1 = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.NameSortParm2 = String.IsNullOrEmpty(sortOrder) ? "role_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
var users = from a in db.app_user
select a;
switch (sortOrder)
{
case "name_desc":
users = users.OrderByDescending(a => a.username);
break;
case "role_desc":
users = users.OrderBy(a => a.user_role);
break;
case "date_desc":
users = users.OrderBy(a => a.date_of_register);
break;
default:
users = users.OrderBy(a => a.username);
break;
}
return View(db.app_user.ToList());
}
查看页面
//DisplayUsers.cshtml page
<table class="table">
<thead>
<tr>
<th>
@Html.ActionLink("User Name", "DisplayUsers", new { sortOrder = ViewBag.NameSortParm1 })
</th>
<th>
@Html.ActionLink("User Role", "DisplayUsers", new { sortOrder = ViewBag.NameSortParm2 })
</th>
<th>
@Html.DisplayNameFor(model => model.is_active)
</th>
<th>
@Html.ActionLink("Enrollment Date", "DisplayUsers", new { sortOrder = ViewBag.DateSortParm })
</th>
<th></th>
</tr>
</thead>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.username)
</td>
<td>
@Html.DisplayFor(modelItem => item.user_role)
</td>
<td>
@Html.DisplayFor(modelItem => item.is_active)
</td>
<td>
@Html.DisplayFor(modelItem => item.date_of_register)
</td>
</tr>
}
</table>
获取错误:
错误1实例参数:无法从“System.DateTime?”转换为
“System.Linq.IQueryable”
错误2“System.DateTime?”不包含的定义
“Contains”和最佳扩展方法重载
'System.Linq.Queryable.ContainessSystem.Linq.IQueryable,
TSource'有一些无效参数
如何在日期字段上进行搜索?
请帮助我,我们将非常感谢您提供的任何帮助。您没有返回用户变量。在下面修好了
public ActionResult DisplayUsers(string sortOrder, string searchString)
{
ViewBag.NameSortParm1 = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.NameSortParm2 = String.IsNullOrEmpty(sortOrder) ? "role_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
var users = from a in db.app_user
select a;
switch (sortOrder)
{
case "name_desc":
users = users.OrderByDescending(a => a.username);
break;
case "role_desc":
users = users.OrderBy(a => a.user_role);
break;
case "date_desc":
users = users.OrderBy(a => a.date_of_register);
break;
default:
users = users.OrderBy(a => a.username);
break;
}
return this.View(users.ToList());
// return View(db.app_user.ToList());
}
至于你问题的第二部分
寄存器的date\u的类型为DateTime?,可为空的DateTime类型不包含名为Contains的方法,如果它。。。如果要检查字符串是否为DateTime类型,可以尝试使用以下代码对其进行解析
if (!String.IsNullOrWhiteSpace(searchString))
{
DateTime dateOfRegistration;
bool isDateTime = DateTime.TryParse(searchString, out dateOfRegistration);
if (isDateTime)
{
users = users.Where(user => user.date_of_register == dateOfRegistration);
}
else
{
users = users.Where(a => a.username.Contains(searchString));
}
}
分类:
问题是您使用的是预取列表,但您没有将其发送到视图
return View(db.app_user.ToList());
应该是
return View(user.ToList());
搜索:
您再次使用Contains,它期望对象是可查询的,而datetime不是,因此您需要为datetime筛选器编写一个特例:
DateTime datetime = Convert.ToDateTime(searchString);
if (datetime.TimeOfDay != TimeSpan.Zero) //comparison with 00:00:00 time
{
filterresults = filterresults.Where(x => x.TimeStarted == datetime);
}
else
{
DateTime plusOneDateTime = datetime.AddDays(1).Date;
filterresults = filterresults.Where(x => x.TimeStarted >= datetime.Date
&& x.TimeStarted < plusOneDateTime);
}
我认为您应该返回users.ToList,而不是返回原始无序集合:return Viewdb.app_user.ToList;这就是你们得到无序数据的原因。谢谢你们。我可以对用户名和用户角色进行排序。但无法在注册日期排序。为什么会这样?因为Contains是一种可以应用于字符串对象的方法,但在您的情况下,注册日期是DateTime类型,所以您需要使用>=对其进行比较,因为存在相同的问题。我无法对字段用户角色和注册日期进行排序。为什么?请您指导我。在else block users=users.where=>a.username.ContainssearchString | | a.date_of_register==searchString;}运算符==不能应用于“System.DateTime”和“string”类型的操作数
DateTime datetime = Convert.ToDateTime(searchString);
if (datetime.TimeOfDay != TimeSpan.Zero) //comparison with 00:00:00 time
{
filterresults = filterresults.Where(x => x.TimeStarted == datetime);
}
else
{
DateTime plusOneDateTime = datetime.AddDays(1).Date;
filterresults = filterresults.Where(x => x.TimeStarted >= datetime.Date
&& x.TimeStarted < plusOneDateTime);
}