【问题标题】:sorting and searching of data in table not working表中数据的排序和搜索不起作用
【发布时间】:2015-04-22 17:14:24
【问题描述】:

我按照以下教程进行排序和搜索:

http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application

当我尝试这样做时,排序不起作用。我想对 3 个字段进行排序,usernameuser_roledate_of_register。我的显示的数据未按任何顺序排序(仅显示数据)。 请任何人帮助我我做错了什么。

//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>

当我这样做时:return View(users.ToList()); 排序仅基于字段用户名,而不是没有用户角色和注册日期。我无法根据用户角色或注册日期对数据进行排序为什么会这样?

用于搜索: 我尝试搜索用户名和 date_of_register 字段。当我尝试代码时:

if (!String.IsNullOrEmpty(searchString))
    {
        users = users.Where(a => a.username.Contains(searchString) || a.date_of_register.Contains(searchString));
    }

得到错误:

错误 1 ​​实例参数:无法从 'System.DateTime?' 转换到 'System.Linq.IQueryable'

错误 2 'System.DateTime?'不包含定义 “包含”和最佳扩展方法重载 'System.Linq.Queryable.Contains(System.Linq.IQueryable, TSource)' 有一些无效参数

如何在日期字段中进行搜索? 请帮我解决这个问题,我们将不胜感激。

【问题讨论】:

  • 我认为你应该返回 users.ToList(),而不是返回原始的无序集合:return View(db.app_user.ToList()); 这就是你得到无序数据的原因。
  • 谢谢你们。我可以对用户名和用户角色进行排序。但无法按注册日期排序。为什么会这样?
  • 因为Contains 是一种可应用于字符串对象的方法,但在您的情况下,注册日期的类型为DateTime,因此您需要改用&gt;= &lt;= 进行比较。

标签: c# linq asp.net-mvc-4 sorting search


【解决方案1】:

排序:

问题是您使用的是预取列表,但您没有将其发送给查看。

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

【讨论】:

    【解决方案2】:

    您没有返回 users 变量。固定在下面

    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());
    } 
    

    至于您问题的第 2 部分...

    date_of_registerDateTime? 类型,可为空的 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));
        }
    }
    

    【讨论】:

    • 我无法对字段用户角色和注册日期进行排序。为什么 ??请你指导我。
    • else 块上出现错误 users = users.Where(a =&gt; a.username.Contains(searchString) || a.date_of_register == (searchString)); } operator == 不能应用于“System.DateTime”类型的操作数?和'字符串'
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多