MVC4做网站后台:栏目管理2、修改栏目

news/2024/5/8 18:57:28/文章来源:https://blog.csdn.net/weixin_30268921/article/details/96986425

接上节添加栏目。

修改栏目与添加栏目非常相似,主要区别在于先向视图传递要修改栏目的model。另外在保存时比添加栏目验证要更多一些。

1、要验证父栏目不能是其本身;

2、父栏目不能是其子栏目;

3、父栏目不能是单页栏目

4、父栏目不能是外部链接

……

另外还有一个ParentParth字段,如果父栏目修改了,其本身和所有子栏目的该字段都要修改。

那么先在控制器中添加一个局部视图action

/// <summary>/// 修改栏目/// </summary>/// <param name="id">栏目Id</param>/// <returns>局部视图</returns>public PartialViewResult Modify(int id){return PartialView(categoryRepository.Find(id));}

再添加其视图,内容基本同,添加栏目

@model Ninesky.Models.Category<div class="c_navbar">栏目管理 >> 修改栏目</div>
@using (Html.BeginForm())
{@Html.AntiForgeryToken()<div class="fs_wapper"><div class="header">修改栏目</div>@Html.HiddenFor(model => model.CategoryId)@Html.ValidationSummary()<table class="fieldset"><tr><th>@Html.LabelFor(model => model.Name)<span>*</span></th><td>@Html.EditorFor(model => model.Name)@Html.ValidationMessageFor(model => model.Name)@Html.DisplayDescriptionFor(model => model.Name)</td></tr><tr><th>@Html.LabelFor(model => model.ParentId)<span>*</span></th><td><input id="ParentId" name="ParentId" style="width: 200px;" data-url="@Url.Action("Tree", "Category")" value="@Model.ParentId" />@Html.ValidationMessageFor(model => model.ParentId)</td></tr><tr><th>@Html.LabelFor(model => model.Type)<span>*</span></th><td><input id="Type" name="Type" value="@Model.Type" />@Html.ValidationMessageFor(model => model.Type)</td></tr><tr><th>@Html.LabelFor(model => model.Model)<span>*</span></th><td><input id="Model" name="Model" value="@Model.Model" data-url="@Url.Action("Items", "Module", new { id = 1 })" />@Html.ValidationMessageFor(model => model.Model)@Html.DisplayDescriptionFor(model => model.Model)</td></tr><tr><th>@Html.LabelFor(model => model.CategoryView)<span>*</span></th><td><input id="CategoryView" class="easyui-combobox" name="CategoryView" data-options="valueField:'Name',textField:'Name',url:'@Url.Action("Views", "View", new { controllerName="Category" })'" value="@Model.CategoryView">@Html.ValidationMessageFor(model => model.CategoryView)</td></tr><tr><th>@Html.LabelFor(model => model.ContentView)<span>*</span></th><td><input id="ContentView" class="easyui-combobox" name="ContentView" data-url="@Url.Action("Views", "View")" data-options="valueField:'Name',textField:'Name',url:'@Url.Action("Views", "View", new { controllerName="Article" })'" value="@Model.ContentView">@Html.ValidationMessageFor(model => model.ContentView)</td></tr><tr><th>@Html.LabelFor(model => model.LinkUrl)<span>*</span></th><td>@Html.EditorFor(model => model.LinkUrl)@Html.ValidationMessageFor(model => model.LinkUrl)@Html.DisplayDescriptionFor(model => model.LinkUrl)</td></tr><tr><th>@Html.LabelFor(model => model.Order)<span>*</span></th><td>@Html.EditorFor(model => model.Order)@Html.ValidationMessageFor(model => model.Order)@Html.DisplayDescriptionFor(model => model.Order)</td></tr><tr><th>@Html.LabelFor(model => model.ContentOrder)<span>*</span></th><td><input id="ContentOrder" name="ContentOrder" class="easyui-combobox" style="width: 200px;"data-options="url:'@Url.Action("OrderList", "Item", new {area="" })',valueField:'Value',textField:'Name'" value="@Model.ContentOrder" />@Html.ValidationMessageFor(model => model.ContentOrder)@Html.DisplayDescriptionFor(model => model.ContentOrder)</td></tr><tr><th>@Html.LabelFor(model => model.PageSize)<span>*</span></th><td>@Html.EditorFor(model => model.PageSize)@Html.ValidationMessageFor(model => model.PageSize)@Html.DisplayDescriptionFor(model => model.PageSize)</td></tr><tr><th>@Html.LabelFor(model => model.RecordUnit)<span>*</span></th><td>@Html.EditorFor(model => model.RecordUnit)@Html.ValidationMessageFor(model => model.RecordUnit)@Html.DisplayDescriptionFor(model => model.RecordUnit)</td></tr><tr><th>@Html.LabelFor(model => model.RecordName)<span>*</span></th><td>@Html.EditorFor(model => model.RecordName)@Html.ValidationMessageFor(model => model.RecordName)@Html.DisplayDescriptionFor(model => model.RecordName)</td></tr><tr><th></th><td><a id="CategoryModify_Save" href="javascript:void()" class="easyui-linkbutton">修改</a></td></tr></table></div>@Scripts.Render("~/Areas/Admin/Scripts/Category.js");<script type="text/javascript">CategoryModify_Ready();</script>@Scripts.Render("~/bundles/jqueryval")

js代码与add类似,粘贴了,看代码吧。

效果

image

重点是,后台处理代码。

首先考虑在父栏目修改时要更改其子栏目的所有ParentParth字段。

首先打开Ninesky.Areas.Admin.Repository.InterfaceCategory接口。

添加函数

/// <summary>/// 修改子栏目父路径/// </summary>/// <param name="originalParth">原路径</param>/// <param name="newParh">新路径</param>/// <returns>布尔值。true表示添加成功,false表示失败。</returns>bool ChangeChildrenParentParth(string originalParth, string newParh);

Ninesky.Areas.Admin.Repository.CategoryRepository写其实现代码。

public bool ChangeChildrenParentParth(string originalParth, string newParh){using (NineskyContext _nineskyContext = new NineskyContext()){var _children = _nineskyContext.Categorys.Where(c => c.ParentPath.IndexOf(originalParth) == 0);foreach(var _child in _children){_child.ParentPath = _child.ParentPath.Replace(originalParth, newParh);}return _nineskyContext.SaveChanges() > 0;}}

下面就是做控制器的修改处理action了。都写了注释就不解释了。

[HttpPost]public JsonResult Modify(Category category){JsonViewModel _jdata = new JsonViewModel();if (ModelState.IsValid)//模型验证通过
            {var _category = categoryRepository.Find(category.CategoryId);//父栏目if (category.ParentId == 0) category.ParentPath = "0";else{var _parentCategory = categoryRepository.Find(category.ParentId);if (_parentCategory == null) ModelState.AddModelError("ParentId", "父栏目不存在。");else if (_parentCategory.Type != 0) ModelState.AddModelError("ParentId", "父栏目不是常规栏目,不能添加子栏目。");//此处验证父栏目不能是其本身else if (category.ParentId  == category.CategoryId) ModelState.AddModelError("ParentId", "父栏目不能是其本身。");//此处验证父栏目不能是其子栏目else if (_parentCategory.ParentPath.IndexOf(_category.ParentPath + "," + _category.CategoryId) == 0) ModelState.AddModelError("ParentId", "父栏目不能是其子栏目。");//设置父栏目路径else category.ParentPath = _parentCategory.ParentPath + "," + _parentCategory.CategoryId;}//根据栏目类型验证字段switch (category.Type){case 0://常规栏目if (string.IsNullOrEmpty(category.Model))//模型为空
                        {category.ContentView = category.LinkUrl = category.RecordUnit = category.RecordName = null;category.ContentOrder = category.PageSize = null;}else{if (string.IsNullOrEmpty(category.CategoryView)) ModelState.AddModelError("CategoryView", "栏目视图不能为空。");if (string.IsNullOrEmpty(category.ContentView)) ModelState.AddModelError("ContentView", "内容视图不能为空。");if (category.ContentOrder == null) ModelState.AddModelError("ContentOrder", "内容排序方式不能为空。");if (category.PageSize == null) ModelState.AddModelError("PageSize", "每页记录数不能为空。");if (string.IsNullOrEmpty(category.RecordUnit)) ModelState.AddModelError("RecordUnit", "记录单位不能为空。");if (string.IsNullOrEmpty(category.RecordName)) ModelState.AddModelError("RecordName", "记录名称不能为空。");category.LinkUrl = null;}break;case 1://单页栏目if (categoryRepository.Children(category.CategoryId).Count() != 0) ModelState.AddModelError("Type", "存在子栏目,无法将栏目类型设为单页栏目。");if (string.IsNullOrEmpty(category.CategoryView)) ModelState.AddModelError("CategoryView", "栏目视图不能为空。");category.Model = category.ContentView = category.LinkUrl = category.RecordUnit = category.RecordName = null;category.ContentOrder = category.PageSize = null;break;case 2:if (categoryRepository.Children(category.CategoryId).Count() != 0) ModelState.AddModelError("Type", "存在子栏目,无法将栏目类型设为外部链接。");if (string.IsNullOrEmpty(category.LinkUrl)) ModelState.AddModelError("LinkUrl", "链接地址不能为空。");category.Model = category.CategoryView = category.ContentView = category.RecordUnit = category.RecordName = category.ContentView = null;category.ContentOrder = category.PageSize = null;break;}//存在逻辑验证错误if (!ModelState.IsValid) return Json(new JsonViewModel(ModelState));else{if (categoryRepository.Modify(category)){//判断父栏目是否更改if (category.ParentId != _category.ParentId) categoryRepository.ChangeChildrenParentParth(_category.ParentPath + "," + category.CategoryId, category.ParentPath + "," + category.CategoryId);return Json(new JsonViewModel() { Success = true, Message = "修改栏目成功!" });}else return Json(new JsonViewModel() { Success = false, Message = "数据未发生更改。" });}}//模型验证失败else return Json(new JsonViewModel(ModelState));}

 

代码见网盘或群Ninesky2013-12-06.rar

转载于:https://www.cnblogs.com/mzwhj/p/3461391.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_851036.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scrapy爬取中国高考志愿填报网站各大学信息

中国高考志愿填报网站爬虫一、环境准备二、问题分析三、spider三、item四、setting五、pipelines一、环境准备 python3.8.3 pycharm 项目所需第三方包 pip install scrapy fake-useragent requests virtualenv -i https://pypi.douban.com/simple1.1创建虚拟环境 切换到指定…

爬虫笔记8:如何处理不信任的SSL证书的网站、cookie的作用、

一、如何处理不信任的SSL证书的网站 比如国家税务总局发票查验平台&#xff08;https://inv-veri.chinatax.gov.cn/&#xff09; 爬取时就会报错&#xff1a; 处理方法&#xff1a;get()中的参数verify设置为False&#xff08;默认是True&#xff09; 二、cookie的作用 cook…

爬虫笔记25:piplines文件的使用、简单案例:scrapy爬取古诗文网站(scrapy中的常用翻页方法)、

一、piplines文件的使用 1、 开启管道 在settings.py文件中取消以下注释&#xff1a; ITEM_PIPELINES { ‘mySpider.pipelines.MyspiderPipeline’: 300, } ​ 2 、回到爬虫文件当中&#xff0c;把数据yield 给管道。 为什么是yield的原因&#xff1a; 不会浪费内存翻页的逻…

爬虫笔记25补充:scrapy爬取古诗文网站(爬取原文和译文时,遇到‘展开阅读全文’的处理)

如图&#xff1a; kenne 我们点击查看网页原代码&#xff0c;发现隐藏的数据并不在原代码中&#xff0c; 我们点击检查-network-再点击展开阅读全文 在又加载出来的数据中&#xff0c;找到下图椭圆框中的Response,发现这里有完整的译文及注释。由此我打开其Headers中的url&am…

微信开放平台---网站应用开发---微信登录功能 简介

1 微信开放平台&#xff1a;https://open.weixin.qq.com/ 2 开通流程&#xff1a; 3 微信官方教程&#xff1a;https://open.weixin.qq.com/cgi-bin/showdocument?actiondir_list&tresource/res_list&verify1&idopen1419316505&token&langzh_CN 4 效果展示…

抓取某一个网站整站的记录 【记录】

经常由于某些原因我们需要爬取某一个网站或者直接复制某一个站点&#xff0c;到网上找了很多工具进行测试&#xff0c;试了很多各有各的问题&#xff0c;最终选择了Teleport Ultra&#xff0c;用起来效果很好&#xff1b;具体的操作手册等东西就不在这里说了&#xff0c;网上搜…

谈谈个人网站的建立(三)—— 定时任务

欢迎访问我的网站http://www.wenzhihuai.com/ 。谢谢啊&#xff0c;如果可以&#xff0c;希望能在GitHub上给个star&#xff0c;GitHub地址https://github.com/Zephery/newblog 。 Quartz 先看一下Quartz的架构图&#xff1a;一.特点&#xff1a; 强大的调度功能&#xff0c;例…

同步、异步方式对SEO搜索引擎优化的影响

本人昨天去面试了&#xff0c;面试官问了这样一个问题“你知道SEO不&#xff1f;同步、异步对SEO有什么影响&#xff1f;”&#xff0c;我当时就懵了&#xff0c;这几个名词SEO、同步、异步我都知道&#xff0c;但是。SEO和同步异步有什么关系呢&#xff1f;面试官人很nice&…

记录使用scrapy爬取新闻网站最新新闻存入MySQL数据库,每天定时爬取自动更新

爬取每天更新的新闻&#xff0c;使用scrapy框架&#xff0c;Python2.7&#xff0c;存入MySQL数据库&#xff0c;将每次的爬虫日志和爬取过程中的bug信息存为log文件下。定义bat批处理文件&#xff0c;添加到计划任务程序中&#xff0c;自动爬取。 额… 1.在items文件中&#x…

6个线上视频音频转换网站

1.Zamzar Zamzar是一项免费的线上转换格式网站&#xff0c;把歌曲、图档、影像和文件转变成不同的格式。其服务特点是高品质的文件格式转换。基本的免费服务&#xff0c;可以让您转换的文件大小为100MB 。如果想拥有更多功能的服务&#xff0c;你可以注册成为基础会员&#xff…

四年大学下那些让我欲罢不能的网站

在本科学习期间&#xff0c;通过Google/百度搜索接触了各种各样的学习网站&#xff0c;收益匪浅&#xff0c;现在来分享一下吧 分为三种类型&#xff0c;“课程网站”&#xff0c;“编程网站”&#xff0c;“社区网站”&#xff0c;贵精不贵多&#xff0c;每种分享几个 课程网站…

Github Pages + jekyll 全面介绍极简搭建个人网站和博客

本文将会全面介绍一下如何使用Github Pages jekyll搭建个人站点&#xff0c;所谓极简的意思就是不用使用git和本地构建jekll服务&#xff0c;直接在Github网站上编辑设置即可&#xff0c;但会涉及到jekll的一些配置和编程控制。可以参看我的网站模板&#xff1a;https://scott…

css可以对网页干什么,css对网页的优势-专业SEO技术教程(33)

css对网页的优势-专业SEO技术教程(33)采用css布局相对于传统的table网页布局的显著优势1.表现和内容相分离将设计部分剥离出来的放在一个独立样式文件中&#xff0c;HTML文件中只存放文本信息。这样的页面对搜索引擎更加友好。2.提高页面浏览速度对于同一个页面视觉效果&#x…

【转载】IIS网站如何同时解析带www和不带www的域名

针对公网上线的网站系统&#xff0c;很多网站的域名会同时含有带www和不带www的域名解析记录&#xff0c;如果需要同时解析带www和不带www的域名信息&#xff0c;则需要在相应的域名解析平台(如阿里云域名解析平台、腾讯云域名解析平台)设置不带www的主域名以及带www的域名解析…

搜索引擎优化:常用的SEO六个指标

在做网站推广过程中&#xff0c;搜索引擎优化是一个重要点&#xff0c;绝大部分行业来自自然搜索的流量都是非常大的&#xff0c;正因为如此&#xff0c;一般企业隔一段时间就对网站自然搜索的情况作一个KPI考核&#xff0c;而这些重点指标不外乎&#xff1a;网页的收录数量、网…

阿里云上发布自己的网站的方法

在阿里云上发布自己的网站的方法&#xff1a; 一、在阿里云上发布自己的网站的方法&#xff1a; 进入我的电脑&#xff0c;在头部输入ftp&#xff1a;//60.205.48.122&#xff08;IP地址为自己注册的阿里云账号上的IP地址&#xff09; 进入以后登录自己的账号 用户名&#x…

java使用HttpURLConnection检索网站时403错误处理方式

java使用HttpURLConnection检索网站时403错误处理方式: 我们通过代码方式访问网站时会报错&#xff1a; 此种情况分2中类型&#xff0c; 1.需要登录才可以访问&#xff1b; 2.需要设置User-Agent来欺骗服务器。 connection.setRequestProperty("User-Agent", &qu…

解决某些网站,图片不能下载

如下图&#xff0c;右键图片&#xff0c;没有保存图片的选项 按下F12 拷贝src中的地址&#xff0c;输入到浏览器&#xff0c;这时候就可以保存图片了

给duckling网站加上cnzz网站统计信息

第一&#xff0c;注册cnzz帐号&#xff0c;网址http://www.cnzz.com/ 第二&#xff0c;登录帐号&#xff0c;获取代码&#xff1b; 第三&#xff0c;根据自己的需要&#xff0c;将代码加入网站的公共页面&#xff0c;比如说head、foot、version页面都可以。 第四&#xff0c…

网站压力测试工具Jmeter安装与使用

系统是Windows XP 配置此工具前&#xff0c;需要先在机器上安装jdk 如下是在jdk1.7的基础上配置的&#xff1b; 安装步骤如下&#xff1a; 第一步&#xff1a;解压apache-jmeter-2.8.zip文件至c盘&#xff0c;本文解压至C:\jmeter2.8目录下。 第二步&#xff1a;桌面上选择“我…