由于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类型的list IEnumerable<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,暂时
时间: 2024-11-12 09:01:26