asp.netcore如何从服务器获得数据(Asp.netCore6学习笔记)
asp.netcore如何从服务器获得数据(Asp.netCore6学习笔记)public async Task OnGetAsync()观察浏览器最终的URL为:<div class="text-center"> @{ var PrevEnabled = Model.PageIndex == 1 ? "disabled" : ""; var NextEnabled = Model.PageIndex == Model.TotalPage ? "disabled" : ""; } <a asp-route-pageindex="@(Model.PageIndex-1)" asp-route-searchstring="@Model.SearchString"
示例数据模型定义:
public class Movie
{
public int Id { get; set; }
[Display(Name = "名称")]
public string Title { get; set; } = string.Empty;
[DataType(DataType.Date) Display(Name = "发行日期")]
public DateTime ReleaseDate { get; set; }
[Display(Name = "类型")]
public string Genre { get; set; } = string.Empty;
[Display(Name = "价格")]
public decimal Price { get; set; }
}
分页要用到的几个参数:
[BindProperty(SupportsGet =true)]
public int PageCount { get; set;} /*每页显示条数*/
[BindProperty(SupportsGet = true)]
public int PageIndex { get; set; }/*当前页*/
public int TotalPage { get; set; }/*总页数*/
参数的计算:
//整数除以整数,舍弃小数部分,
//比如10条记录,每页显示8条,整数部分为1 但实际上是2页,所以要加1
TotalPage = movies.Count() / PageCount 1;
//每页显示10条,共10条记录,整数部分也为1,但实际上只有一页,就不需要加1了。
if (PageCount == movies.Count()) TotalPage = 1;
if (PageIndex > TotalPage) PageIndex = TotalPage;
if (PageIndex < 1) PageIndex = 1;
Movie = await movies.Skip((PageIndex-1) * PageCount).Take(PageCount).ToListAsync();
核心代码:
Movie = await movies.Skip((PageIndex-1) * PageCount).Take(PageCount).ToListAsync();
表示跳过(PageIndex-1) * PageCount条记录,取PageCount个记录。
在cshtml文件中的查询部分,设置每页显示多少个:
<form>
<p>
类型:
<select asp-for="MovieGenre" asp-items="Model.Genres">
<option value="">全部</option>
</select>
标题:<input type="text" name="SearchString" asp-for="SearchString" placeholder="请输入关键字" />
每页<input type="number" asp-for="PageCount" max=10 min=5 />条
</p>
<p>
<input type="submit" class="btn btn-primary" value="查找" />
<button class="btn btn-outline-secondary">
<a asp-route-pagecount="@Model.PageCount"
class="text-decoration-none" asp-page="/Movies/Index">全部</a>
</button>
</p>
</form>
上一页、下一页、页数跳转部分
<div class="text-center">
@{
var PrevEnabled = Model.PageIndex == 1 ? "disabled" : "";
var NextEnabled = Model.PageIndex == Model.TotalPage ? "disabled" : "";
}
<a asp-route-pageindex="@(Model.PageIndex-1)"
asp-route-searchstring="@Model.SearchString"
asp-route-moviegenre="@Model.MovieGenre"
asp-route-pagecount="@Model.PageCount"
class="btn btn-secondary @PrevEnabled">
上一页
</a>
<span>@((Model.PageIndex) "/" (Model.TotalPage))</span>
<a asp-route-pageindex="@(Model.PageIndex 1)"
asp-route-searchstring="@Model.SearchString"
asp-route-moviegenre="@Model.MovieGenre"
asp-route-pagecount="@Model.PageCount"
class="btn btn-secondary @NextEnabled">
下一页
</a>
<form method="get" class="d-inline">
<input type="hidden" asp-for="@Model.SearchString" />
<input type="hidden" asp-for="@Model.MovieGenre" />
<input type="hidden" asp-for="@Model.PageCount" />
到<input type="number" max="@Model.TotalPage" min=1 asp-for="PageIndex" />页
</form>
</div>
总之,所有刷新页面的操作都包含了搜索条件和分页参数。无论是显示全部,还是搜索结果,都统一调用
public async Task OnGetAsync()
观察浏览器最终的URL为:
...Movies?pageindex=第几页&moviegenre=类型&title=名称&pagecount=每页记录数
在上一页、下一页按钮中
asp-route-xxx=yyy
asp-route-{value} 单个 URL 路由值。 例如,asp-route-id="1234",生成的url中会包含id=1234。
在跳转到第几页的form:用隐藏控件保存参数,不知这种方法是否最优?
最终页面效果:
最终页面效果
初学C#,依样画瓢,聊以为记。