• 学习MVC框架,处理分页和删除分页转跳的问题


    第一次写博客,文采不好请多见谅,这里主要是写一下,自己是如何处理分页问题,我想初学者也遇到过这个问题。

    分页的情况下,编辑信息有返回和编辑2个按钮,操作后都是应该返回原分页界面,使用TempData把分页的参数传递过去,但是只传递一个,另外一个不传递参数,导致点击返回能返回正常的分页,而点击编辑的情况下,直接返回到首页。

    解决方式:大概的介绍下TempData的使用。TempData保存在Session中,Controller每次请求的时候都会从Session中获取 TempData,然后清除Session。基于这样的事实,在每次请求结束后,TempData的生命周期也就结束了。使用form传递另外一个参数,大概的解决方式说了

    好了下面上代码让大家看下

    首先我们要在”资料列表“界面中获取数据,首先是获取pageSize当前页的数据条数,page所在的第几页,recountCount数据的总条数

     public ActionResult FileInfoList(int page = 0)
            {
                string errorMsg = TempData["errorMsg"] as string;
                if (!string.IsNullOrEmpty(errorMsg))
                {
                    ModelState.AddModelError("ErrorMsg", errorMsg);
                }
                int pageSize = 10;
                int pageIndex = page;
                int recountCount = 0;
                ViewBag.PageSize = pageSize;
                ViewBag.PageIndex = pageIndex;
    
                List<UploadFileModel> list = new List<UploadFileModel>();
                IUploadFileService file = LoadService<IUploadFileService>();
                Criteria c = new Criteria();
                try
                {
    
                    c.AddOrderBy(UploadFileModel._FileId, OrderByDirection.Desc);
    
                    list = file.GetPagedUploadFileModel(c, pageIndex, pageSize, out recountCount);
                }
                catch (System.Exception e)
                {
                    ModelState.AddModelError("ErrorMsg", "列表加载失败");
                }
                this.TempData["pageSize"] = pageSize;
                this.TempData["page"] = page;
                this.TempData["recountCount"] = recountCount;
                return View(list);
            }

    this.TempData[]的形式,把数据传递到需要调用数据的(编辑资料信息)界面 传递给ViewData["page"] = this.TempData["page"];的方式

      /// <summary>
            /// 编辑资料信息界面
            /// </summary>
            /// <param name="fileId"></param>
            /// <returns></returns>
            public ActionResult EditFileInfo(int fileId)
            {
                ViewData["page"] = this.TempData["page"];
                if (fileId == 0)
                {
                    return RedirectToAction("FileInfoList");
                }
                IUploadFileService upload = LoadService<IUploadFileService>();
                UploadFileModel model = new UploadFileModel();
                try
                {
                    model = upload.GetUploadFileModelById(fileId);
                }
                catch (Exception e)
                {
                    ModelState.AddModelError("ErrorMsg", "信息显示失败");
                }
    
                return View(model);
            }

    前端通过 @Html.Hidden("Page", ViewData["page"])表单传递的方式隐藏的把page参数在传递到编辑方法代码中,如下面所示

      /// <summary>
            /// 编辑资料的方法
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            [HttpPost]
            [ValidateAntiForgeryToken]
            [ValidateInput(false)]
            public ActionResult EditFileInfo(UploadFileModel model)
            {
                string message = "";
                model.FileLastTime = DateTime.Now;
                //通过表单的形式获取传递的page
                int page = Convert.ToInt32(Request.Form["Page"]);
                if (ModelState.IsValid)
                {
                    IUploadFileService upload = LoadService<IUploadFileService>();
                    try
                    {
                        upload.Update(model);
                        message = "编辑成功";
                        TempData["message"] = message;
                        if (page > 0)
                        {
    
                            return RedirectToAction("FileInfoList", "FileManage", new { page });
                        }
                        return RedirectToAction("FileInfoList", "FileManage");
                    }
                    catch (Exception e)
                    {
                        ModelState.AddModelError("ErrorMsg", "编辑失败");
                    }
                }
                return View(model);
            }

    使用int page = Convert.ToInt32(Request.Form["Page"]);的方式把前台表单传递的page获取,用return RedirectToAction("FileInfoList", "FileManage", new { page });的方式返回分页。返回按钮直接通过界面中 ViewData["page"] = this.TempData["page"];的方法获取page的值。代码如下

     <input type="button" name="btnBack" style="border-style:none" class="grayBtn" value="返 回" onclick="window.location.href='@Url.Action("FileInfoList", new { page = ViewData["page"] })'" />

    这样的方式解决了ViewData和TempData传值的问题。
    在写下关于删除的,要考虑的情况是,当你所处分页中只有最后一条数据的情况下,点击删除我们需要返回的不是本页而是上一页,如果是最后一页,则不做变动。如下我们看下代码

    /// <summary>
            /// 删除单个资料
            /// </summary>
            /// <param name="fileId"></param>
            /// <returns></returns>
            public ActionResult DeleFileInfo(int fileId)
            {
                UploadFileModel model = new UploadFileModel();
                IUploadFileService file = LoadService<IUploadFileService>();
    
                int page = (int)this.TempData["page"];
                int recountCount = (int)this.TempData["recountCount"];
                int pageSize = (int)this.TempData["pageSize"];
    
                try
                {
                    model = GetUploadFileModelByFileId(fileId);
                    file.Delete(model);
                }
                catch (Exception e)
                {
                    ModelState.AddModelError("ErrorMsg", "删除失败");
                }
                //判断要删除的分页内数据情况,如果是分页内最后一条数据则删除后转跳到page-1的页面,否则转跳到page的界面
                if (page > 0)
                {
                    //使用向上取整防止出现BUG
                    if (Math.Ceiling(Convert.ToDouble(recountCount % (page * pageSize))) == 1)
                    {
                        page = page - 1;
                        return RedirectToAction("FileInfoList", "FileManage", new { page });
                    }
                    return RedirectToAction("FileInfoList", "FileManage", new { page });
                }
                return RedirectToAction("FileInfoList", "FileManage");
            }

    这里的3个局部变量也是从“资料列表”界面获取,这里的pageSize 是每页的最大数据条数。我们这里先判断是否是最后一页if (page > 0),如果是在进入判断用 recountCount 总数据条数/(page第几页*pageSize每页的最大数据条数)的余数,然后使用Math.Ceiling进行向上取整,防止pageSize 是每页的最大数据条数不是10的情况下出现的小数,来判断是否是最后一条数据,如果是所在页面-1,返回上一页,不是则返回本页

  • 相关阅读:
    tsc errors All In One
    TypeScript declare Set Array type All In One
    Linux exit nano editor All In One
    Linux bash pbcopy command All In One
    千焦与千卡的换算公式 All In One
    linux 中 sed N选项将两行合并为一行处理
    linux 中 sed n选项将两行作为一行处理,屏蔽第一行
    linux 中sed命令删除匹配字符之前的一行
    linux 中sed命令 P和p的区别
    linux 中 sed命令替换命令时i选项忽略大小写
  • 原文地址:https://www.cnblogs.com/myhomebo/p/5259441.html
Copyright © 2020-2023  润新知