由于EF的框架是4.1的,所以现在如果想更新部分字段的话,只能从数据库中查出一次数据(不用查的方法还没找到,需要继续研究),不能像5.1的版本可以不用查。
更新的Action需要用到[HttpGet]和[HttpPost],否则会不知道具体执行哪个方法。
代码
[HttpGet]public ActionResult Modify(int id){BlogArticle art = (from a in db.BlogArticles where a.AId == id select a).FirstOrDefault();
//第二种查询方式BlogArticle art1 = db.BlogArticles.Where(d => d.AId == id).FirstOrDefault();//查询分类list 先将分类表中数据查询出来,然后转换成list,然后在将这个list转换成IEnumerable类型的listIEnumerable<SelectListItem> list = (from c in db.BlogArticleCates where c.IsDel == false select c).ToList().Select(c=>new SelectListItem { Value = c.Id.ToString(), Text = c.Name });ViewBag.cateList = list;return View(art);}[HttpPost]public ActionResult Modify(BlogArticle model){try{BlogArticle cate = db.BlogArticles.Single(x => x.AId == model.AId);cate.ATitle = model.ATitle;cate.ACate = model.ACate;cate.AContent = model.AContent;db.SaveChanges();return RedirectToAction("Index", "Home");}catch (Exception ex){return Content("修改失败" + ex.ToString());}}
前台代码:
@model MvcBlog.Models.BlogArticle
@using(Html.BeginForm("Modify","Home",FormMethod.Post)){<table><tr><td colspan=2>修改 @Html.HiddenFor(d=>d.AId)</td></tr><tr><td>标题</td><td>@Html.TextBoxFor(d=>d.ATitle)</td></tr><tr><td>内容</td><td>@Html.TextAreaFor(d=>d.AContent,10,20,null)</td></tr><tr><td>分类</td><td>@Html.DropDownListFor(a=>a.ACate,ViewBag.cateList as IEnumerable<SelectListItem>)</td></tr><tr><td colspan=2><input type="submit" value="保存" />@Html.ActionLink("返回","Index","Home")</td></tr></table>}
在Action中,可以直接使用return View(art)返回这个model到页面的构造函数中。在页面中用@model MvcBlog.Models.BlogArticle,来将传入的这个model
转换成指定类型,否则页面不知道model是哪种类型,转换之后,直接就可以用model使用这个对象了。
对于修改的分类字段,需要用下拉列表进行存放数据,所以需要在Action中查出一遍分类的数据,然后用ViewBag传到前台。
前台页面生成这些控件,一般都用代码直接生成,对比以前比较方便。
另外,Html.BeginForm,如果不在外层加using的话,将不会生成</form>的结束标记,所以需要注意,要用using,暂时