ASP.NET MVC示例(二)

  • ASP.NET MVC示例(二)已关闭评论
  • 92 views
  • A+
所属分类:C#.NET 编程技术

表单检索

下面我们为表格页面增加一个搜索表单,用来对表格数据进行过滤。

 

先增加一些记录:

ASP.NET MVC示例(二)

添加表单检索字段:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <p>
        所学专业: @Html.DropDownList("Major",
ViewBag.MajorList as IEnumerable<SelectListItem>, "全部")
        姓名: @Html.TextBox("Name")
        <input type="submit" value="检索" />
    </p>
}

由于本示例比较简单,没有单独的表来存储所学专业,因此我们需要从用户表中检索,并存储到ViewBag.MajorList中传入视图:

private List<SelectListItem> GetMajorList()
{
       var majors = db.Students.OrderBy(m => m.Major).Select(m => m.Major).Distinct();
 
       var items = new List<SelectListItem>();
       foreach(string major in majors)
       {
              items.Add(new SelectListItem {
                     Text = major,
                     Value = major
              });
       }
       return items;
}
 
// GET: Students
public ActionResult Index()
{
       ViewBag.MajorList = GetMajorList();
       return View(db.Students.ToList());
}

页面运行效果:

ASP.NET MVC示例(二)

增加POST请求的处理方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string Major, string Name)
{
       var students = db.Students as IQueryable<Student>;
       if (!String.IsNullOrEmpty(Name))
       {
              students = students.Where(m => m.Name.Contains(Name));
       }
 
       if (!String.IsNullOrEmpty(Major))
       {
              students = students.Where(m => m.Major == Major);
       }
 
       ViewBag.MajorList = GetMajorList();
       return View(students.ToList());
}

此时的运行效果:

ASP.NET MVC示例(二)

数据库分页

分页工具条

首先改造视图代码,增加分页工具条:

<div id="pagebar">
    @for (var i = 0; i < ViewBag.PageCount; i++)
    {
        if (i == ViewBag.PageIndex)
        {
            <span class="currentpagenumber">@(i + 1)</span>
        }
        else
        {
            <a class="pagenumber" href="javascript:;">@(i + 1)</a>
        }
    }
</div>

其中ViewBag.PageIndexViewBag.PageCount是由控制器传入的分页参数,我们需要这两个数据来构造分页链接,如果是当前分页就显示为文本,如果是其他页就显示为超链接,然后通过客户端JavaScript来注册点击事件。

EF的数据库分页

后台控制器代码:

private static readonly int PAGE_SIZE = 3;
 
private int GetPageCount(int recordCount)
{
       int pageCount = recordCount / PAGE_SIZE;
       if (recordCount % PAGE_SIZE != 0)
       {
              pageCount += 1;
       }
       return pageCount;
}
 
private List<Student> GetPagedDataSource(IQueryable<Student> students,
int pageIndex, int recordCount)
{
       var pageCount = GetPageCount(recordCount);
       if (pageIndex >= pageCount && pageCount >= 1)
       {
              pageIndex = pageCount - 1;
       }
 
       return students.OrderBy(m => m.Name)
      .Skip(pageIndex * PAGE_SIZE)
      .Take(PAGE_SIZE).ToList();
}
 
// GET: Students
public ActionResult Index()
{
       var students = db.Students as IQueryable<Student>;
       var recordCount = students.Count();
       var pageCount = GetPageCount(recordCount);
      
       ViewBag.PageIndex = 0;
       ViewBag.PageCount = pageCount;
 
       ViewBag.MajorList = GetMajorList();
       return View(GetPagedDataSource(students, 0, recordCount));
}

EF为我们封装了大部分的细节,所以上面的数据库分页代码非常直观和容易理解:

students

.OrderBy(m => m.Name)

.Skip(pageIndex * PAGE_SIZE)

.Take(PAGE_SIZE).ToList()

 

完成一个典型的数据库分页需要如下几部:

  1. OrderBy:指定排序列
  2. Skip:跳过多少条记录
  3. Take:返回的最大记录数

 

上面的OrderBy是必须指定的,否则就会报错:

ASP.NET MVC示例(二)

 

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
助力产业智慧升级,云服务器首年88元起,更有千元代金券礼包免费领!