ASP.NET 8 Razor列表功能(包括分页)

本文介绍了如何在ASP.NETMVC中创建一个商品列表,包括数据模型(Commodity)、控制器(A04ActualCombatController)实现静态数据填充、视图(View)中的搜索和分页功能,以及使用组件化开发进行AJAX删除操作。
摘要由CSDN通过智能技术生成

1、在Models文件夹下新建Commodity.cs

public partial class Commodity
{
    public int Id { get; set; }
    public long? ProductId { get; set; }
    public int? CategoryId { get; set; }

    [Required(ErrorMessage = "Title不能为空")]
    [StringLength(500, ErrorMessage = "最长只能是500长度")]
    public string? Title { get; set; }
    public decimal? Price { get; set; }

    public string? Url { get; set; }
    public string? ImageUrl { get; set; }
}

2、Controller

public class A04ActualCombatController : Controller
{
    private static List<Commodity> commodities = new List<Commodity>(); 

    /// <summary>
    /// 静态构造函数在整个进程中只执行一次
    /// </summary>
    static A04ActualCombatController()
    {
        for (int i = 1; i <= 201; i++)
        {
            commodities.Add(new Commodity()
            {
                Id = i,
                CategoryId = i,
                ImageUrl = "xxx.img",
                Price = new Random().Next(10, 30),
                ProductId = i + new Random().Next(10, 30),
                Title = $"商品-{i}",
                Url = "xxx.com"
            });
        }
    }

    public IActionResult Index(string searchString, int pageIndex, int pageSize = 10)
    {
        List<Commodity> commodityList = commodities;
        if (!string.IsNullOrWhiteSpace(searchString))
        {
            commodityList = commodities.Where(c => c.Title.Contains(searchString)).ToList();
        }

        PagingResult<Commodity> pagingResult = new PagingResult<Commodity>()
        {
            DataList = commodityList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(),
            SearchString = searchString,
            PageIndex = pageIndex,
            PageSize = pageSize,
            RecordCount = commodityList.Count
        };
        return View(pagingResult);
    }
}

3、View

@model PagingResult<Commodity>;

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

@using (Html.BeginForm("Index", Model.SearchString, FormMethod.Get, new { @class = "row g-3" }))
{
    <p></p>
    @await Html.PartialAsync("SearchPartialView", Model)
    @await Html.PartialAsync("CommodityPartialView", Model.DataList)
    @* 分页使用组件便于复用 *@
    @await Component.InvokeAsync("Pagination",
                new { pageIndex = Model.PageIndex, pageSize = Model.PageSize, totalCount = Model.RecordCount })
}

4、新建分页组件

ComponentExt文件夹下新建类PaginationViewComponent.cs

[ViewComponent(Name = "Pagination")]
public class PaginationViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync(int pageIndex, int pageSize, int totalCount)
    {
        int totalPageCount = totalCount / pageSize;
        if (totalCount % pageSize > 0)
        {
            totalPageCount = totalCount / pageSize + 1;
        }
        ViewBag.TotalPageCount = totalPageCount;
        ViewBag.CurrentPageIndex = pageIndex;
        return await Task.FromResult(View("~/Utility/ComponentExt/Views/PaginationView.cshtml"));
    }
}

ComponentExt/Views文件夹下新建视图PaginationView.cshtml

<nav>
    <ul class="pagination">
        @{
            const int pageIncrement = 2;
            const int pageTrailing = 5;
            var totalPageCount = ViewBag.TotalPageCount == null ? 1 : (int)ViewBag.TotalPageCount;
            if (totalPageCount > 1)
            {
                var pageIndex = ViewBag.CurrentPageIndex == null ? 1 : (int)ViewBag.CurrentPageIndex;
                var pageRangeStart = pageIndex <= pageIncrement ? 1 : pageIndex - pageIncrement;
                var pageRangeEnd = pageIndex + pageIncrement <= totalPageCount ? (totalPageCount > pageTrailing && pageIndex + pageIncrement < pageTrailing ? pageTrailing : pageIndex + pageIncrement) : totalPageCount;
                if (pageRangeStart > 1)
                {
                    <li class="page-item">
                        <input name="pageIndex" type="submit" class="page-link" style="cursor: pointer;" value="1" />
                    </li>
                    if (pageRangeStart > 2)
                    {
                        <li class="page-item disabled">
                            <input name="pageIndex" type="submit" class="page-link" style="cursor: pointer;" value="..." />
                        </li>
                    }
                }
                for (var i = pageRangeStart; i <= pageRangeEnd; i++)
                {
                    <li class="page-item @(pageIndex == i ? "active" : null)">
                        <input name="pageIndex" type="submit" class="page-link" style="cursor: pointer;" value="@i" />
                    </li>
                }
                if (pageRangeEnd < totalPageCount)
                {
                    if (pageRangeEnd + 1 < totalPageCount)
                    {
                        <li class="page-item disabled">
                            <input name="pageIndex" type="submit" class="page-link" style="cursor: pointer;" value="..." />
                        </li>
                    }
                    <li class="page-item">
                        <input name="pageIndex" type="submit" class="page-link" style="cursor: pointer;" value="@totalPageCount" />
                    </li>
                }
            }
        }
    </ul>
</nav>

A04ActualCombat中新建PartialView

SearchPartialView.cshtml

@model PagingResult<Commodity>
<p></p>
<div class="mb-3 row">
    <label class="col-sm-1 col-form-label">关键字</label>
    <div class="col-sm-2">
        @Html.TextBox("searchString", Model.SearchString, new { @class = "form-control", @placeholder = "关键字" })
    </div>
    <div class="col-sm-1">
        <button type="submit" class="btn btn-primary mb-3">查询</button>
    </div>
    <div class="col-sm-2">
        @Html.ActionLink("创建Commodity", "Create")
    </div>
</div>

CommodityPartialView.cshtml

@model List<Commodity>
<div id="partialajaxlist" style="width:100%">
    <table class="table">
        <tr>
            <th>Id</th>
            <th>标题</th>
            <th>@Html.ActionLink("价格", "Index", new { orderBy = ViewBag.OrderBy, searchString = ViewBag.SearchString, page = 1 })</th>
            <th>Url</th>
            <th>图片</th>
            <th>Action</th>
        </tr>
        @foreach (Commodity item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Id)@*//强类型 可以展示display*@
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Title)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Price)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Url)
                </td>
                <td>
                    <img src="@item.ImageUrl" width="40px" />
                </td>
                <td>
                    <a href="/Ninth/Details/@item.Id">详情</a>|
                    @Html.ActionLink("编辑", "Edit", new { id = item.Id }) |
                    @Html.ActionLink("删除", "Delete", new { id = item.Id }) |
                    <a id="@item.Id" href="javascript:void(0);" onclick="ajaxDelete(this)">ajax删除</a>
                </td>
            </tr>
        }
    </table>
</div>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ASP.NET Core Razor编程中,列表模板页面是非常常见的。这些页面通常用于显示数据库或其他数据源中的一组记录。 在本文中,我将向您展示如何使用ASP.NET Core Razor列表模板页面。 首先,我们需要创建一个模型类来代表我们的数据。例如,假设我们正在构建一个博客应用程序,我们需要一个名为“Post”的模型类来表示博客文章。以下是一个示例模型类: ```csharp public class Post { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } public DateTime CreatedDate { get; set; } } ``` 接下来,我们需要创建一个控制器类来处理与“Post”模型类相关的操作。以下是一个示例控制器类: ```csharp public class PostController : Controller { private readonly ApplicationDbContext _context; public PostController(ApplicationDbContext context) { _context = context; } public IActionResult Index() { var posts = _context.Posts.ToList(); return View(posts); } } ``` 在此示例控制器中,我们从数据库中检索所有博客文章,并将它们传递给视图。 现在,我们需要创建一个视图来显示我们的博客文章列表。我们可以使用ASP.NET Core Razor模板引擎来创建一个动态模板,该模板可以将我们的博客文章显示为HTML表格。以下是一个示例视图: ```html @model IEnumerable<Post> <table> <thead> <tr> <th>Title</th> <th>Content</th> <th>Created Date</th> </tr> </thead> <tbody> @foreach (var post in Model) { <tr> <td>@post.Title</td> <td>@post.Content</td> <td>@post.CreatedDate.ToShortDateString()</td> </tr> } </tbody> </table> ``` 在此示例视图中,我们使用了一个foreach循环遍历我们的博客文章,并将它们显示为HTML表格行。 最后,我们需要在控制器的Index方法中返回视图。在我们的示例控制器中,我们已经传递了一个包含所有博客文章的IEnumerable<Post>对象。我们可以将此对象传递给视图,如下所示: ```csharp public IActionResult Index() { var posts = _context.Posts.ToList(); return View(posts); } ``` 现在,当我们访问PostController的Index操作时,我们将看到一个包含所有博客文章的HTML表格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄健华Yeah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值