2014-11-05 90 views
2

所以基本上我已经完成了所有的排序,过滤和分页与本教程的帮助,这非常非常方便,因为我对这个材料很新。无论如何,我现在有问题,现在尝试排序和筛选我的几个表有多个主键。排序,过滤和分页MVC

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

我创建了var应用程序和数据库的变种,但我想,如果我有办法将它们结合起来,我不会有我的分页问题。因为我的回报观点会更简洁。

public ActionResult Index(string sortOrder, string searchString, int? page) 
    { 
     ViewBag.CurrentSort = sortOrder; 
     ViewBag.IDSortParm = String.IsNullOrEmpty(sortOrder) ? "AppID_desc" : ""; 
     ViewBag.NameSortParm = sortOrder == "Name" ? "AppName_desc" : "Name"; 
     ViewBag.ID2SortParm = sortOrder == "ID" ? "DatabaseID_desc" : "ID"; 
     ViewBag.Name2SortParm = sortOrder == "Name2" ? "DatabaseName_desc" : "Name2"; 

     if (Request.HttpMethod != "GET") 
     { 
      page = 1; 
     } 
     ViewBag.CurrentFilter = searchString; 


     var applications = from a in db.Application_ 
         select a; 
     var databases = from d in db.Database_ //this is what I added 
         select d; 
     if (!String.IsNullOrEmpty(searchString)) 
     { 
      applications = applications.Where(s => s.AppName.ToUpper().Contains(searchString.ToUpper())); 
      databases = databases.Where(d => d.DatabaseName.ToUpper().Contains(searchString.ToUpper())); //also what I added 
     } 
     switch (sortOrder) 
     { 
      case "AppID_desc": 
       applications = applications.OrderByDescending(a => a.AppID); 
       break; 
      case "Name": 
       applications = applications.OrderBy(a => a.AppName); 
       break; 
      case "AppName_desc": 
       applications = applications.OrderByDescending(a => a.AppName); 
       break; 
      case "Name2": 
       databases = databases.OrderBy(d=> d.DatabaseName); 
       break; 
      case "DatabaseName_desc": 
       databases = databases.OrderByDescending(d => d.DatabaseName); 
       break; 
      default: 
       applications = applications.OrderBy(a => a.AppID); 
       break; 

     } 
     int pageSize = 10; 
     int pageNumber = (page ?? 1); 
     return View(applications.ToPagedList(pageNumber, pageSize)); 
    } 

我添加了var数据库,因为我需要搜索database_table中的值以及应用程序表。

指数:

@using (Html.BeginForm()) 
{ 
<p> 
    Search Name: @Html.TextBox("Search_Data", ViewBag.FilterValue as string) 
    <input type="submit" value="Find" /> 
</p> 
} 
<table class="table"> 

<tr> 
    <th> 
     @Html.ActionLink("AppID", "Index", new { sortOrder = ViewBag.IDSortParm }) 
    </th> 
    <th> 
     @Html.ActionLink("ApplicationName", "Index", new { sortOrder = ViewBag.NameSortParm }) 
    </th> 
    <th> 
     @Html.ActionLink("DatabaseID", "Index", new { sortOrder = ViewBag.ADSortParm }) 
    </th> 
    <th> 
     @Html.ActionLink("DatabaseName", "Index", new { sortOrder = ViewBag.Name2SortParm }) 
    </th> 

我相信我在与该指数的问题,但很明显,我一般敢无知所以不管你的援助可以提供将不胜感激。

谢谢!

编辑: 为了更加清晰,加上我找到了一种更好地解释自己的方法。

+0

“*我现在有问题试图进行排序和筛选我的几个表*” - 问题是什么(它不排序,它有时不排序,只有某些页面排序,它不会过滤等)?你的问题目前还不清楚实际问题是什么(预期的行为,目前的行为)。 – jadarnel27 2014-11-05 15:50:36

+0

具有多个主键的表格根本无法排序。 – momofierce 2014-11-05 15:51:01

+0

据我所知,你正试图在一个网格中看到表格应用程序和数据库,并能够点击标题来排序数据? – Pavel 2014-11-05 16:01:35

回答

0

推测您正在搜索的Database数据与Application数据有某些相关性。我打算出去走一走,说每个Application可能有Database。而不是使用一个单独的变量,你可能希望使用导航属性修改applications查询,像这样:

 case "Name2": 
      applications = applications.OrderBy(a => a.Database.DatabaseName); 
      break; 
     case "DatabaseName_desc": 
      applications = applications.OrderByDescending(a => a.Database.DatabaseName); 
      break; 
+0

它似乎并不奏效。它不认可d。在第一个上下文中,然后是数据库。在第二个上下文 – momofierce 2014-11-05 16:41:12

+2

我想'd'是误印。将其更改为'a' – Pavel 2014-11-05 17:09:40

+0

它无法识别数据库。现在。我想这是因为我的var是如何声明的。 var applications = from a in db.Application_ select a; – momofierce 2014-11-05 17:14:42

1

我想通了,我是有这个排序问题。

var applications = from a in db.Application_ 
        select a; 
    var databases = from d in db.Database_ //this is what I added 
        select d; 

需:

var appdb = from a in db.AppDB_ 
         select a; 

这是我犯的一个错误。

我也只是想出了我将如何解决我的搜索问题。我只是将int从AppID转换为一个字符串。

if (!String.IsNullOrEmpty(searchString)) 
    { 
    appdb = appdb.Where(a => a.AppID.ToString().Contains(searchString.ToUpper())); 
    }  
2

下面是一个例子,应该帮助你解决问题的排序

ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; 
    ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date"; 

这里的

public ActionResult Index(string sortOrder) 
    { 
     ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : ""; 
     ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date"; 
     var students = from s in db.Students 
         select s; 
     switch (sortOrder) 
     { 
      case "Name_desc": 
      students = students.OrderByDescending(s => s.LastName); 
      break; 
      case "Date": 
      students = students.OrderBy(s => s.EnrollmentDate); 
      break; 
      case "Date_desc": 
      students = students.OrderByDescending(s => s.EnrollmentDate); 
      break; 
      default: 
      students = students.OrderBy(s => s.LastName); 
      break; 
     } 
     return View(students.ToList()); 
    } 

例子是显示

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      @Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm }) 
     </th> 
     <th>First Name 
     </th> 
     <th> 
      @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm }) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
视图的例子

我也发布了一个搜索deature whigh可能是得心应手

public ViewResult Index(string sortOrder, string searchString) 
{ 
    ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; 
    ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date"; 
    var students = from s in db.Students 
        select s; 
    if (!String.IsNullOrEmpty(searchString)) 
    { 
     students = students.Where(s => s.LastName.Contains(searchString) 
           || s.FirstMidName.Contains(searchString)); 
    } 
    switch (sortOrder) 
    { 
     case "name_desc": 
      students = students.OrderByDescending(s => s.LastName); 
      break; 
     case "Date": 
      students = students.OrderBy(s => s.EnrollmentDate); 
      break; 
     case "date_desc": 
      students = students.OrderByDescending(s => s.EnrollmentDate); 
      break; 
     default: 
      students = students.OrderBy(s => s.LastName); 
      break; 
    } 

    return View(students.ToList()); 
} 

视图中显示

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 

@using (Html.BeginForm()) 
{ 
    <p> 
     Find by name: @Html.TextBox("SearchString") 
     <input type="submit" value="Search" /></p> 
} 

<table> 
    <tr>