【问题标题】:Sorting, Filtering and Paging MVC排序、过滤和分页 MVC
【发布时间】:2014-11-05 15:46:55
【问题描述】:

所以基本上我已经在本教程的帮助下完成了所有的排序、过滤和分页,这非常非常方便,因为我对这种材料非常陌生。无论如何,我现在在尝试对一些具有多个主键的表进行排序和过滤时遇到问题。

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 应用程序和 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_ 表和应用程序表中搜索值。

索引:

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

我相信我的索引有问题,但显然我总体上很无能,所以无论您能提供什么帮助,我们都将不胜感激。

谢谢!!

编辑: 为了更清楚,另外我找到了一种更好地解释自己的方法。

【问题讨论】:

  • "我现在在尝试排序和过滤我的一些表时遇到问题" - 问题是什么(它不排序,它不排序有时,只有某些页面排序,它不过滤等)?您的问题目前尚不清楚实际问题是什么(预期行为、当前行为)。
  • 具有多个主键的表根本不会排序。
  • 据我了解,您正试图在一个网格中同时查看表应用程序和数据库,并能够单击标题对数据进行排序?
  • 是的,如果我的胡言乱语难以理解,我很抱歉。这东西真的很难说。
  • 请提供表应用程序和数据库的实体定义。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

这是一个可以帮助您解决问题的示例

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

排序示例

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

这是要显示的视图示例

<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) {

我还发布了一个搜索功能 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>

【讨论】:

    【解决方案2】:

    我发现了我遇到的排序问题。

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

    【讨论】:

      【解决方案3】:

      大概您正在搜索的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;
      

      【讨论】:

      • 它似乎不起作用。它不承认 d。在第一个上下文中,然后是数据库。在第二种情况下
      • 我想d 是印刷错误。将其更改为a
      • 它无法识别数据库。现在。我想这是因为我的 var 是如何声明的。 var applications = from a in db.Application_ select a;
      • @momofierce:你的实体有导航属性吗?他们之间的关系是怎样的?
      猜你喜欢
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2018-01-13
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      相关资源
      最近更新 更多