上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据。
一、删除文章
由于公共模型跟,文章,附件有关联,所以这里的删除次序很重要,如果先删除模型,那么文章ModelID和附件的ModelID多会变成null,所以要先先删除文章和附件再删除公共模型。
由于公共模型和附件是一对多的关系,我们把删除公共模型和删除附件写在一起。
在BLL的BaseRepository类中有默认的Delete方法,但这个方法中仅删除模型,不会删除外键,所以在CommonModelRepository在new一个出来封印掉默认的方法。
public new bool Delete(Models.CommonModel commonModel, bool isSave = true) { if (commonModel.Attachment != null) nContext.Attachments.RemoveRange(commonModel.Attachment); nContext.CommonModels.Remove(commonModel); return isSave ? nContext.SaveChanges() > 0 : true; }
这个的意思是封印掉继承的Delete方法,在新的方法中如果存在附加那么先删除附件,再删除公共模型。那么如果我们还想调用基类的Delete方法怎么办?可以用base.Delete。
好了,现在可以开始删除了。
在ArticleController中添加Delete方法
/// <summary> /// 删除 /// </summary> /// <param>文章id</param> /// <returns></returns> public JsonResult Delete(int id) { //删除附件 var _article = articleService.Find(id); if(_article == null) return Json(false); //附件列表 var _attachmentList = _article.CommonModel.Attachment; var _commonModel = _article.CommonModel; //删除文章 if (articleService.Delete(_article)) { //删除附件文件 foreach (var _attachment in _attachmentList) { System.IO.File.Delete(Server.MapPath(_attachment.FileParth)); } //删除公共模型 commonModelService.Delete(_commonModel); return Json(true); } else return Json(false); }
二、修改文章
这个部分跟添加文章非常类似
首先在ArticleController中添加显示编辑视图的Edit
/// <summary> /// 修改 /// </summary> /// <param></param> /// <returns></returns> public ActionResult Edit(int id) { return View(articleService.Find(id)); }
右键添加视图,这个跟添加类似,没什么好说的直接上代码
@section scripts{ <script type="text/javascript" src="https://www.jb51.net/~/Scripts/KindEditor/kindeditor-min.js"></script> <script type="text/javascript"> //编辑框 KindEditor.ready(function (K) { window.editor = K.create('#Content', { height: '500px', uploadJson: '@Url.Action("Upload", "Attachment")', fileManagerJson: '@Url.Action("FileManagerJson", "Attachment", new { id = @Model.CommonModel.ModelID })', allowFileManager: true, formatUploadUrl: false }); //首页图片 var editor2 = K.editor({ fileManagerJson: '@Url.Action("FileManagerJson", "Attachment", new {id=@Model.CommonModel.ModelID })' }); K('#btn_picselect').click(function () { editor2.loadPlugin('filemanager', function () { editor2.plugin.filemanagerDialog({ viewType: 'VIEW', dirName: 'image', clickFn: function (url, title) { var url; $.ajax({ type: "post", url: "@Url.Action("CreateThumbnail", "Attachment")", data: { originalPicture: url }, async: false, success: function (data) { if (data == null) alert("生成缩略图失败!"); else { K('#CommonModel_DefaultPicUrl').val(data); K('#imgpreview').attr("src", data); } editor2.hideDialog(); } }); } }); }); }); }); </script> } @model Ninesky.Models.Article @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div role="form"> <h4>添加文章</h4> <hr /> @Html.ValidationSummary(true) <div> <label for="CommonModel_CategoryID">栏目</label> <div> <input data-options="url:'@Url.Action("JsonTree", "Category", new { model="Article" })'" value="@Model.CommonModel.CategoryID" /> @Html.ValidationMessageFor(model => model.CommonModel.CategoryID)</div> </div> <div> @Html.LabelFor(model => model.CommonModel.Title, new { @class = "control-label col-sm-2" }) <div> @Html.TextBoxFor(model => model.CommonModel.Title, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.CommonModel.Title)</div> </div> <div> @Html.LabelFor(model => model.Author, new { @class = "control-label col-sm-2" }) <div> @Html.TextBoxFor(model => model.Author, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.Author) </div> </div> <div> @Html.LabelFor(model => model.Source, new { @class = "control-label col-sm-2" }) <div> @Html.TextBoxFor(model => model.Source, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.Source) </div> </div> <div> @Html.LabelFor(model => model.Intro, new { @class = "control-label col-sm-2" }) <div> @Html.TextAreaFor(model => model.Intro, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.Intro) </div> </div> <div> @Html.LabelFor(model => model.Content, new { @class = "control-label col-sm-2" }) <div> @Html.EditorFor(model => model.Content) @Html.ValidationMessageFor(model => model.Content) </div> </div> <div> @Html.LabelFor(model => model.CommonModel.DefaultPicUrl, new { @class = "control-label col-sm-2" }) <div> <img src="https://www.jb51.net/@Model.CommonModel.DefaultPicUrl" /> @Html.HiddenFor(model => model.CommonModel.DefaultPicUrl) <a>选择…</a> @Html.ValidationMessageFor(model => model.CommonModel.DefaultPicUrl) </div> </div> <div> <div> <input type="submit" value="保存" /> </div> </div> </div> }
开始做后台接受代码,在ArticleController中添加如下代码。