Python语言技术文档

微信小程序技术文档

php语言技术文档

jsp语言技术文档

asp语言技术文档

C#/.NET语言技术文档

html5/css技术文档

javascript

点击排行

您现在的位置:首页 > 技术文档 > MVC/.NET框架

ASP.NET_MVC5网站开发修改及删除文章(十)

来源:中文源码网    浏览:161 次    日期:2024-05-05 05:54:07
【下载文档:  ASP.NET_MVC5网站开发修改及删除文章(十).txt 】


ASP.NET MVC5网站开发修改及删除文章(十)
上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个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方法
///
/// 删除
///

/// 文章id
///
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
///
/// 修改
///

///
///
public ActionResult Edit(int id)
{
return View(articleService.Find(id));
}
右键添加视图,这个跟添加类似,没什么好说的直接上代码
@section scripts{


}
@model Ninesky.Models.Article
@using (Html.BeginForm())
{ @Html.AntiForgeryToken()

添加文章




@Html.ValidationSummary(true)




@Html.ValidationMessageFor(model => model.CommonModel.CategoryID)



@Html.LabelFor(model => model.CommonModel.Title, new { @class = "control-label col-sm-2" })

@Html.TextBoxFor(model => model.CommonModel.Title, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.CommonModel.Title)



@Html.LabelFor(model => model.Author, new { @class = "control-label col-sm-2" })

@Html.TextBoxFor(model => model.Author, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Author)



@Html.LabelFor(model => model.Source, new { @class = "control-label col-sm-2" })

@Html.TextBoxFor(model => model.Source, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Source)



@Html.LabelFor(model => model.Intro, new { @class = "control-label col-sm-2" })

@Html.TextAreaFor(model => model.Intro, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Intro)



@Html.LabelFor(model => model.Content, new { @class = "control-label col-sm-2" })

@Html.EditorFor(model => model.Content)
@Html.ValidationMessageFor(model => model.Content)



@Html.LabelFor(model => model.CommonModel.DefaultPicUrl, new { @class = "control-label col-sm-2" })


@Html.HiddenFor(model => model.CommonModel.DefaultPicUrl)
选择…
@Html.ValidationMessageFor(model => model.CommonModel.DefaultPicUrl)








}
开始做后台接受代码,在ArticleController中添加如下代码。
[HttpPost]
[ValidateInput(false)]
[ValidateAntiForgeryToken]
public ActionResult Edit()
{
int _id = int.Parse(ControllerContext.RouteData.GetRequiredString("id"));
var article = articleService.Find(_id);
TryUpdateModel(article, new string[] { "Author", "Source", "Intro", "Content" });
TryUpdateModel(article.CommonModel, "CommonModel", new string[] { "CategoryID", "Title", "DefaultPicUrl" });
if(ModelState.IsValid)
{
if (articleService.Update(article))
{
//附件处理
InterfaceAttachmentService _attachmentService = new AttachmentService();
var _attachments = _attachmentService.FindList(article.CommonModel.ModelID, User.Identity.Name, string.Empty,true).ToList();
foreach (var _att in _attachments)
{
var _filePath = Url.Content(_att.FileParth);
if ((article.CommonModel.DefaultPicUrl != null && article.CommonModel.DefaultPicUrl.IndexOf(_filePath) >= 0) || article.Content.IndexOf(_filePath) > 0)
{
_att.ModelID = article.ModelID;
_attachmentService.Update(_att);
}
else
{
System.IO.File.Delete(Server.MapPath(_att.FileParth));
_attachmentService.Delete(_att);
}
}
return View("EditSucess", article);
}
}
return View(article);
}
详细讲解一下吧:
1、[ValidateInput(false)] 表示不验证输入内容。因为文章内容包含html代码,防止提交失败。
2、[ValidateAntiForgeryToken]是为了防止伪造跨站请求的,也就说只有本真的请求才能通过。
见图中的红线部分,在试图中构造验证字符串,然后再后台验证。
3、public ActionResult Edit()。看这个方法没有接收任何数据,我们再方法中使用TryUpdateModel更新模型。因为不能完全相信用户,比如如果用户构造一个CateggoryID过来,就会把文章发布到其他栏目去。
这个是在路由中获取id参数
再看这两行,略有不同
第一行直接更新article模型。第一个参数是要更新的模型,第二个参数是更新的字段。
第二行略有不同,增加了一个前缀参数,我们看视图生成的代码 @Html.TextBoxFor(model => model.CommonModel.Title 是带有前缀CommonModel的。所以这里必须使用前缀来更新视图。
三、修改文章列表
写完文章后,就要更改文章列表代码用来删除和修改文章。
打开List视图,修改部分由2处。
1、js脚本部分

增加了修改方法、删除方法,在datagrid里添加行双击进入修改视图的方法
onDblClickRow: function (rowIndex, rowData) { window.parent.addTab("修改文章", "@Url.Action("Edit","Article")/" + rowData.ModelID, "icon-page"); }
2、
四、我的文章列表
我的文章列表与全部文章类似,并简化掉了部分内容那个,更加简单,直接上代码了
Article控制器中添加
///
/// 文章列表Json【注意权限问题,普通人员是否可以访问?】
///

/// 标题
/// 录入
/// 栏目
/// 日期起
/// 日期止
/// 页码
/// 每页记录
///
public ActionResult JsonList(string title, string input, Nullable category, Nullable fromDate, Nullable toDate, int pageIndex = 1, int pageSize = 20)
{
if (category == null) category = 0;
int _total;
var _rows = commonModelService.FindPageList(out _total, pageIndex, pageSize, "Article", title, (int)category, input, fromDate, toDate, 0).Select(
cm => new Ninesky.Web.Models.CommonModelViewModel()
{
CategoryID = cm.CategoryID,
CategoryName = cm.Category.Name,
DefaultPicUrl = cm.DefaultPicUrl,
Hits = cm.Hits,
Inputer = cm.Inputer,
Model = cm.Model,
ModelID = cm.ModelID,
ReleaseDate = cm.ReleaseDate,
Status = cm.Status,
Title = cm.Title
});
return Json(new { total = _total, rows = _rows.ToList() });
}
public ActionResult MyList()
{
return View();
}
///
/// 我的文章列表
///

///
///
///
///
///
///
public ActionResult MyJsonList(string title, Nullable fromDate, Nullable toDate, int pageIndex = 1, int pageSize = 20)
{
int _total;
var _rows = commonModelService.FindPageList(out _total, pageIndex, pageSize, "Article", title, 0, string.Empty, fromDate, toDate, 0).Select(
cm => new Ninesky.Web.Models.CommonModelViewModel()
{
CategoryID = cm.CategoryID,
CategoryName = cm.Category.Name,
DefaultPicUrl = cm.DefaultPicUrl,
Hits = cm.Hits,
Inputer = cm.Inputer,
Model = cm.Model,
ModelID = cm.ModelID,
ReleaseDate = cm.ReleaseDate,
Status = cm.Status,
Title = cm.Title
});
return Json(new { total = _total, rows = _rows.ToList() }, JsonRequestBehavior.AllowGet);
}
为MyList右键添加视图





-

查询





要注意的是删除文章时删除的次序,修改文章时TryUpdateModel的使用,希望本文对大家的学习有所帮助。

相关内容