MVC+LINQ+EF实战(.NET平台)

来源:互联网 发布:少年手指虎淘宝 编辑:程序博客网 时间:2024/06/05 02:24

    学习软件开发的重点是动手实践,只是站在河边学习动作要领和游泳理论,是永远学不会游泳的,你一定要下水试试。这次实例练习主要涉及了三个核心知识,一个是MVC框架,一个是EntityFramework,还有一个就是Linq

    第一步:新建项目,创建一个基于MVC的应用程序,如下图所示:


    第二步:在Model层创建edmx文件及其附属类,这里要用到EF。简单来介绍一下EF吧,EF就是EntityFrameWork,即ORM(ObjectRelationalMapping)对象关系数据库映射框架,根据实体对象操作数据表中数据的一种面向对象的操作框架。下面我们来看如何用实体对象映射数据库表的数据:

    在我的SQL Server中有事先建好的几张表如下图所示,我们主要对news表进行操作


    在Models文件夹右击添加新建项,在对话框的左边列表中选择数据,之后在右边的列表中选择ADO.NET实体数据模型,如下图所示:







    经过上述所示的一系列操作,我们会看到系统为我们创建的edmx文件的图形化显示以及文件组织结构如下图



    在解决方案资源管理器中的Models文件下可以看到这个文件及其子文件的组织结构,具体每个文件的作用和原理在这里不再说明,大家感兴趣可以自己研究。

    第三步:进行代码编写,主要是对Controller进行设计和编码,需要写代码的主要有三个文件,分别是HomeController.csIndex.cshtmlModify.cshtml,分别给出如下:

         HomeController.cs的代码如下:

<span style="font-size:18px;">namespace MVCBlog.Controllers{    public class HomeController : Controller    {        /// <summary>        /// 数据上下文对象        /// </summary>        newssystemEntities db = new newssystemEntities();        #region 查询新闻列表+ActionResult Index()        /// <summary>        /// 查询新闻列表        /// </summary>        /// <returns></returns>        public ActionResult Index()        {            //1.查询数据库里的新闻数据(通过EF执行)            //1.1第一种方法:使用SQO(标准查询运算符),查询所有新闻            //db.news.Where(d =>d.id  !=0 );            //List<Models.news> list = db.news.Where(d => d.id != 0).ToList ();            //1.2第二种方法:使用linq语句,查询所有新闻标题            //Linq仅仅是给程序员使用的语法糖,.net编译器会在编译时将linq转化为sqo            List <Models.news> list = (from d in db.news where d.id != 0 select d).ToList ();            //2.将数据集合传给视图            ViewData["datalist"] = list;            //3.加载视图            return View();        }         #endregion        #region 执行删除操作(根据id)+ActionResult Del(int id)        /// <summary>        /// 执行删除操作(根据id)        /// </summary>        /// <param name="id">要删除的新闻id</param>        /// <returns></returns>        public ActionResult Del(int id)        {            try            {                //1.创建要删除的对象                news modelDel = new news() { id = id };                //2.将对象添加到EF管理容器中                db.news.Attach(modelDel);                //3.将对象包装类的状态标识为删除状态                db.news.Remove(modelDel);                //4.更新到数据库                db.SaveChanges();                //5.更新成功,则令浏览器跳转到list方法                return RedirectToAction("Index","Home");            }            catch (Exception ex)            {                return Content("删除失败!"+ex .Message );            }          }         #endregion        #region 显示要修改的数据(根据id)+ActionResult Modify(int id)        [HttpGet ]        /// <summary>        /// 执行修改操作(根据id)        /// </summary>        /// <param name="id">要修改的新闻id</param>        /// <returns></returns>        public ActionResult Modify(int id)        {            try            {                //根据id查询数据库,返回集合中,拿到第一个实体对象                news n = (from a in db.news where a.id == id select a).FirstOrDefault();                //生成分类下拉框列表集合List<SelectListItem> list                IEnumerable <SelectListItem> listitem = (from c in db.categories select c  ).ToList (). Select (c=> new SelectListItem {Value =c.id .ToString (),Text =c.name });                ViewBag.CateList = listitem;                //将n传递给视图显示 viewbag 或者viewdata                //加载视图,使用view的构造函数 将数据传给视图上的名为model的属性                return View(n);            }            catch (Exception ex)            {                return Content("修改失败!" + ex.Message);            }        }        #endregion        #region 执行修改操作+ActionResult Modify(news model)        [HttpPost ]        /// <summary>        /// 执行修改操作        /// </summary>        /// <param name="model"></param>        /// <returns></returns>        public ActionResult Modify(news model)        {            try            {                //将实体对象加入到EF对象容器中,并获取伪包装类对象                DbEntityEntry<news> entry = db.Entry<news>(model);                //将包装类对象的状态设置为unchanged                entry.State = System.Data.EntityState.Unchanged;                //设置需要提交的实体属性                entry.Property(a => a.title).IsModified = true;                entry.Property(a => a.content).IsModified = true;                //提交到数据库 完成修改                db.SaveChanges();                //5.更新成功,则令浏览器跳转到list方法                return RedirectToAction("Index", "Home");            }            catch (Exception ex)            {                return Content("修改失败!" + ex.Message);            }                      }         #endregion      }}</span>

         Index.cshtml的代码如下:

<span style="font-size:18px;">@using MVCBlog.Models @{    Layout = null;}<!DOCTYPE html><html><head>    <title>Index</title>    <style type ="text/css" >        #tblist        {            border :1px solid #0ff;            width :800px;            margin :10px auto ;            border-collapse :collapse ;        }       #tblist th,td        {            border :1px solid #0ff;            padding :10px;        }    </style>    <script type ="text/javascript" >        function Del(id) {            alert("运行到了这里");            if (confirm("您确定要删除吗?亲~~")) {                window.location="/Home/Del/" + id;            }        }        function Modify(id) {            window.location = "/Home/Modify/" + id;        }    </script></head><body>    <table id ="tblist" >        <tr>            <th >id</th>            <th >标题</th>            <th >发布时间</th>            <th >新闻分类</th>            <th >操作</th>        </tr>        <!--遍历Action方法 设置给viewdata的数据集合,生成html代码-->     @foreach (news n in ViewData["datalist"] as List<news>)     {         <tr>            <td>@n.id </td>            <td >@n.title </td>            <td>@n.createTime </td>            <td >@n.category.name  </td>            <td >                <a href ="javascript:Del(@n.id) ">删除</a>                <a href ="javascript:Modify(@n.id )">修改</a>            </td>         </tr>     }    </table></body></html></span>

         Modify.cshtml的代码如下:

<span style="font-size:18px;">@model MVCBlog .Models .news @{    Layout = null;}<!DOCTYPE html><html><head>    <title>修改</title>     <style type ="text/css" >        #tblist        {            border :1px solid #0ff;            width :600px;            margin :10px auto ;            border-collapse :collapse ;        }       #tblist th,td        {            border :1px solid #0ff;            padding :10px;        }    </style></head><body>    @using (Html.BeginForm("Modify", "Home", FormMethod.Post))    {         <table id="tblist">             <tr>                 <td colspan ="2">修改 @Html.HiddenFor(a =>a.id)</td>             </tr>             <tr>                 <td >标题:</td>                 @*<td >@Html.TextBox("txtName",(object )Model.title)</td>*@                 <!--使用htmlhelper的强类型方法直接从model中根据title属性生成文本框-->                 <td>@Html.TextBoxFor(a=>a.title )</td>             </tr>             <tr>                 <td>分类:</td>                 <td >@Html.DropDownListFor(a=>a .category ,ViewBag.CateList as IEnumerable <SelectListItem >)</td>             </tr>             <tr>                 <td >内容:</td>                 <td>@Html.TextAreaFor(a=>a.content,10,60,null  )</td>             </tr>             <tr>                 <td colspan="2"><input type ="submit" value ="确定修改" />@Html.ActionLink("返回","Index","Home")</td>             </tr>         </table>    }</body></html></span>

    第四步,运行程序我们要实现的是对news表的查询、删除和修改,通过主视图Index来显示news表中的所有新闻,然后通过链接进行新闻的删除和修改,运行的截图如下

 

    最后提一下这个Linq,没听说过的小伙伴们可能会有困惑。所谓Linq就是语言集成查询, 是 Visual Studio 2008 和 .NET Framework 3.5版中引入的一项创新功能,它在对象领域和数据领域之间架起了一座桥梁。Linq仅仅是给程序员使用的语法糖,.net编译器会在编译时将linq转化为SQO,而这个SQO是定义在System.Linq.Enumerable类中的50多个为IEnumerable<T>准备的扩展方法,这些方法用来对它操作的集合进行查询筛选,所以说我们本质上是在使用SQO进行查询。

    总结一下这个实例的要点,首先要熟悉MVC框架,这个一般没什么问题,其次要会创建实体框架,这个熟练了也没什么问题,在本例中我觉得最核心的东西是Controller的编写,那里要用到很多的知识,比如如何创建对象,将操作对象添加到EF管理容器中等。此外在分布视图中还要用到HtmlHelper对象的强类型方法直接根据model的属性生成html控件,当然这个强类型方法的很多参数还不太熟练,有待进一步的学习。

6 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 地图鱼身上有白点怎么办 人被广告牌砸了怎么办 小米手机出现繁体中文英文怎么办 雅思考试把姓名写错了怎么办 房贷的流水账假怎么办 报到证报道期限过期了怎么办 注销公司公章丢了怎么办 家里的猫太调皮怎么办 孩子纹身了我该怎么办 46天婴儿感冒了怎么办 狗病了不吃东西怎么办 幼儿急诊见风了怎么办 哺乳期乳房有硬块而且疼怎么办 哺乳期乳头破裂乳房似针扎怎么办 回奶胀痛的厉害怎么办 淡水龟的壳变软了怎么办 棕色的泰迪变白怎么办 大班教案泥石流来了怎么办 鸟类的嘴巴坏了怎么办 四川麦蚊子咬了怎么办 脸上被晒脱皮了怎么办 额头被晒脱皮了怎么办 脸黑一块白一块怎么办 小乌龟的壳软了怎么办 把田螺后面吃了怎么办 微生物生态菌群异常怎么办 怀孕初期感染了动物病毒怎么办? 金龙和银龙打架怎么办 海水缸盐度高了怎么办 洗空调洗坏了怎么办 老师是条青花鱼怎么办 吃了带鱼和南瓜怎么办 苹果平板ad忘了怎么办 小米6进海水了怎么办 小米手机掉海水里怎么办 苹果7进海水了怎么办 7p手机进海水怎么办 育海参苗出现红细菌怎么办 苹果手机掉进厕所怎么办 2个月的婴儿肺炎怎么办 甜甜圈珊瑚脱骨怎么办