添加Model
添加Anime对象
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;
namespace RCKohi.Models.Demo
{
public class Anime
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
[StringLength(100, ErrorMessage = "{0} 必须多于 {2} 位并且少于 {1} 位。", MinimumLength = 1)]
[DataType(DataType.Text)]
[Display(Name = "名称")]
public string Name { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "卷均销量")]
[RegularExpression(@"^([1-9]\d*)$", ErrorMessage = "只能输入整数。")]
public int Number { get; set; }
[Required]
[DataType(DataType.Date)]
[Display(Name = "播放时间")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime BroadcastDate { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "首页显示")]
public bool IndexShow { get; set; }
}
}
添加控制器和视图
修改视图界面,
修改数据库上下文
namespace RCKohi.Data
{
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<RCKohi.Models.ApplicationUser> ApplicationUser { get; set; }
public DbSet<RCKohi.Models.Demo.Anime> Anime { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Anime>().ToTable("Anime");
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
}
}
}
在DbInitializer.cs里添加默认数据
修改默认界面,运行结果
X.PagedList.Mvc.Core这个分页插件蛮好用的,如果分页不需要特别负责的情况下。
用NuGet安装下载分页插件
修改index方法
修改视图,填1行就好了。
分页功能出现了。
之后添加查询和排序功能
修改后的index方法
// GET: Animes
public async Task<IActionResult> Index(int? page, string searchString, string sortOrder)
{
var animes = from s in _context.Anime
select s;
ViewData["CurrentFilter"] = searchString;
if (!String.IsNullOrEmpty(searchString))
{
animes = animes.Where(s => s.Name.Contains(searchString));
}
ViewData["SortOrder"] = sortOrder;
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
ViewData["NumberSortParm"] = sortOrder == "Number" ? "number_desc" : "Number";
switch (sortOrder)
{
case "name_desc":
animes = animes.OrderByDescending(s => s.Name);
break;
case "Date":
animes = animes.OrderBy(s => s.BroadcastDate);
break;
case "date_desc":
animes = animes.OrderByDescending(s => s.BroadcastDate);
break;
case "Number":
animes = animes.OrderBy(s => s.Number);
break;
case "number_desc":
animes = animes.OrderByDescending(s => s.Number);
break;
default:
animes = animes.OrderBy(s => s.Name);
break;
}
var pageNumber = page ?? 1;
return View(await animes.AsNoTracking().ToPagedListAsync(pageNumber, 10));
}
视图
@model IEnumerable<RCKohi.Models.Demo.Anime>
@using X.PagedList.Mvc.Core;
@using X.PagedList;
@{
ViewData["Title"] = "动画作品";
Layout = "~/Views/Shared/_LayoutSbAdmin2.cshtml";
}
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">作品列表</div>
<div class="panel-body">
<div class="dataTables_wrapper form-inline dt-bootstrap no-footer">
<div class="row">
<div class="col-sm-12">
<form asp-action="Index" method="get" role="form">
<div class="form-group input-group">
<input type="text" name="SearchString" value="@ViewData["currentFilter"]" class="form-control" placeholder="搜索..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit" value="Search">
<i class="fa fa-search"></i>
</button>
</span>
</div>
</form>
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>
<a asp-action="Index" asp-route-sortOrder="@ViewData["NameSortParm"]" asp-route-searchString="@ViewData["CurrentFilter"]">@Html.DisplayNameFor(model => model.Name)</a>
</th>
<th>
<a asp-action="Index" asp-route-sortOrder="@ViewData["NumberSortParm"]" asp-route-searchString="@ViewData["CurrentFilter"]">@Html.DisplayNameFor(model => model.Number)</a>
</th>
<th>
<a asp-action="Index" asp-route-sortOrder="@ViewData["DateSortParm"]" asp-route-searchString="@ViewData["CurrentFilter"]">@Html.DisplayNameFor(model => model.BroadcastDate)</a>
</th>
<th>
@Html.DisplayNameFor(model => model.IndexShow)
</th>
<th>操作</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Number)
</td>
<td>
@Html.DisplayFor(modelItem => item.BroadcastDate)
</td>
<td>
@string.Format("{0}", @Html.DisplayTextFor(modelItem => item.IndexShow).ToString() == "True" ? "是" : "否")
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.ID" class="btn btn-sm btn-primary" data-toggle="tooltip" data-placement="bottom" title="编辑"><i class="fa fa-edit"></i></a>
<a asp-action="Details" asp-route-id="@item.ID" class="btn btn-sm btn-info" data-toggle="tooltip" data-placement="bottom" title="查看"><i class="far fa-file-alt"></i></a>
<a asp-action="Delete" asp-route-id="@item.ID" class="btn btn-sm btn-warning" data-toggle="tooltip" data-placement="bottom" title="删除"><i class="far fa-trash-alt"></i></a>
</td>
</tr>
}
</tbody>
</table>
@Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page, sortOrder = ViewData["SortOrder"], searchString = ViewData["CurrentFilter"] }))
</div>
</div>
</div>
</div>
</div>
</div>
</div>
最后效果如下