2015-04-22 40 views
0

我按照教程上的排序和搜索來自:排序和在表中的數據的搜索不工作

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個字段,用戶名,user_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)); 
    } 

得到的錯誤:

Error 1 Instance argument: cannot convert from 'System.DateTime?' to 'System.Linq.IQueryable'

Error 2 'System.DateTime?' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.Queryable.Contains(System.Linq.IQueryable, TSource)' has some invalid arguments

我怎樣才能讓搜索的日期字段? 請幫助我,這些任何幫助將不勝感激。

+0

我想你應該返回'users.ToList()',而不是你正在返回原始的無序集合:'返回視圖(db.app_user.To List());'這就是你得到無序數據的原因。 –

+0

謝謝你們。我可以對用戶名和用戶角色進行排序。但不能排序**入學日期**。爲什麼這樣? – user4221591

+0

因爲'Contains'是一種可以應用於String對象的方法,但是在您的情況下,Enrollment Date的類型爲DateTime,所以您需要使用'> = <='來比較它。 –

回答

0

Sorting:

問題是您正在使用預取列表,但您沒有發送它來查看。

return View(db.app_user.ToList()); 

應該

return View(user.ToList()); 

Searching:

你又使用包含該預期目標是可查詢的,而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); 
} 
0

您沒有返回用戶變量。固定它下面

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

我無法對字段User Role和Enrollment Date進行排序。爲什麼?請你能指導我。 – user4221591

+0

** else else ** block'users = users.Where(a => a.username.Contains(searchString)|| a.date_of_register ==(searchString)); }'** operator ==不能應用於'System.DateTime'類型的操作數。和'string'** – user4221591

相關問題