上一篇文章介绍了ASP.NET MVC使用EF查询数据,并通过EF中的DbQueryT泛型对象延迟加载数据。今天就来看看我们是怎么用EF删除数据的。
实际上,目前Web开发的一般模式是前端使用Js和JQuery与后端进行交互。然后我们将在前端添加两个删除和更新脚本。代码如下:
!-通过Action方法遍历集合数据集到ViewData,生成HTML代码-@ foreach(blog article a in view data[' datalist ']as list blog){ tr td@a.AId/td td@a.ATitle/td td@a.BlogArticleCate.Name/td TD @ a . enumeration . e _ cname/TD td@a.AAddtime/td!-为文章列表添加一个删除按钮-TDA href=' JavaScript 3360 del(@ a . aid)' delete/a/TD/tr }然后为这个按钮编写一个Js脚本函数,代码如下:
脚本类型=“text/JavaScript”函数del (id) {if (confirm('您确定要删除吗?)) {!-在这里,配置当用户决定删除时js会让页面跳转到的url地址-window . location='/home/del/' id;} }/上述脚本的Js代码表示当用户点击删除按钮时,url跳转地址为“/home/del”id。
点击前的效果如下。请注意,网址是。
意思是浏览器现在根据路由请求controller,Controller根据路由配置返回view方法,然后尝试将Html、Js等发送回浏览器。
点击删除按钮并确认,注意网址是。
解释我们配置的路由信息是“home/del”。
因此,我们在控制器的HomeController中添加了一个del方法来完成删除操作。代码如下:
首先,我们来看看MVC的默认路由表配置,它位于App_Start文件夹下的RouteConfig.cs中。代码如下:
//路由表配置了公共类路由配置{公共静态void register routes(路由集合路由){routes。忽略路由(' {resource})。axd/{ * path info } ');路线。MapRoute(名称:“Default”,URL :“{ controller }/{ action }/{ id }”,Default s 3360 new { controller=“Home”,action=“Index”,id=UrlParameter。可选});}}我们可以发现ur的默认配置模式是“{controller}/{action}/{id}”。
的默认配置信息是Defaults 3360 new { controller=' home ',action=' index ',id=urlparameter。可选}。
尤其是,id=UrlParameter。可选是可选的。
因此,我们应该用下面的代码在homeController.cs中创建一个del类型的Action方法:
//删除文章公共操作结果del(int id){//使用try.catch以捕获操作数据库中的异常{//创建删除的对象blog artic=new log article();artTicle。AId=id//将删除的对象添加到EF对象管理容器db . blog articles . attach(artticle)中;//将对象包装类的状态标记为deleted state db . blogacrticles . remove(artticle);//更新数据库数据库。saveChanges();//更新成功后,页面跳转到Index页面Return RedirectToAction ('index ',' home ');} catch(exception ex){ return redirectto action('友好页面');}//返回View();}这就完成了数据删除操作。
接下来,我们将完成修改后的代码。首先,我们显示视图代码如下。
!-生成一个表单,并且指明表单提交方法,和路由-@使用(Html .开始通知('修改','主页,表单方法发布){表id=' TbList ' tr TD col span=' 2 '修改@Html .hidden FOr(a=a . AId)/TD/tr TD标题:/td @*td@Html .文本框(' txtName ',(对象)模型. ATitle)/td*@!-使用HtmlHelper的强类型方法直接从模型中根据一点点属性生成文本框- td@Html .textbox FOr(a=a . ATitle)/TD/tr TD分类:/td!-使用强类型方法生成下拉框,并自动根据模型属性里的ACate值设置下拉框的默认选中项- td@Html .DropDownListFor(a=a . a . a . ate,ViewBag .类别列表为IEnumerableselectlistitem)/TD/tr tr TD内容:/td!-使用HtmlHelper的强类型方法直接从模型中根据内容属性生成文本域- td@Html .TextAreaFor(a=a.AContent,10,60,null)/TD/tr TD colspan=' 2 '输入类型='submit '值='确定修改/@Html .ActionLink('返回、"索引"、"主页"/td /tr /table }我们的后端代码改如何编写呢?
//因为我们这个行动是在表达以邮政方式提交时执行的,所以加上标识[HttpGet] ///summary ///加载需要修改文章////summary ///param name='id '需要修改文章的id/param////返回/返回公共操作结果EditArticle(int id){//获取需要编辑文章,并且返回该实体对象的第一个元素BlogArticle art=(以为单位从c开始博客文章.其中c.AId==id select c ).first ordefault();//我们把文章的分类做成一个下拉列表,并且给DropList的选择权赋值IEnumerableSelectListItem(来自数据库中的博客文章其中a.IsDel==false选择a ).ToList().选择(a=新的SelectListItem { Value=a . id。tostring(),Text=a . Name });//返回目录对象视图包类别列表=选择列表项返回视图();}接下来就是执行修改的代码:[HttpIt]///summary///执行修改的代码////summary////param name=' model '/param////returns/returns public action result Modify(BlogArticle model){ try {//1 .将实体对象a.加入仰角指示器对象容器中,并b.获取伪包装类对象DbEntityEntryBlogArticle条目=db .EntryBlogArticle(模型);//2.将包装类对象的状态设置为未更改的条目。状态=系统。数据。实体状态。未更改;//3.设置被改变的属性入口。属性IsModified=true入口。属性IsModified=true入口。属性(a=a.ACate).IsModified=true//4。提交到数据库完成修改db .saveChanges();//5.更新成功,则命令浏览器重定向到/主页/列表方法返回RedirectToAction('Index ',' Home ');}捕获(例外情况){ 0返回内容('修改失败~~~' ex .消息);} } 到此我们就完成了使用手动音量调节建立一个小站点的任务,而且也完成了对数据的增删改查的操作。
希望本文所述对大家学习有所帮助。