zoukankan      html  css  js  c++  java
  • 学习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,返回上一页,不是则返回本页

  • 相关阅读:
    csuoj 1391: Boiling Vegetables
    csuoj 1392: Number Trick
    nyist 78 圈水池
    1393: Robert Hood 旋转卡壳 凸包
    模板 旋转卡壳 凸包
    模板 凸包 旋转卡壳
    ASP.NET Web API2返回值处理流程
    DependencyInjection源码解读之ServiceProvider
    深入研究EF Core AddDbContext 引起的内存泄露的原因
    私有云方案——利用阿里云云解析实现DDNS
  • 原文地址:https://www.cnblogs.com/myhomebo/p/5259441.html
Copyright © 2011-2022 走看看