如何利用MVC+EF实现前台传值

来源:互联网 发布:linux查看普通用户 编辑:程序博客网 时间:2024/05/13 10:36

   之前做项目的时候用过三层架构,是一种分层式的软件体系架构。在这个新的项目中,我第一次接触到了MVC也用到了分层的思想,巧的很也是三层的结构,但是二者还是有很大的出处的。


1.MVC和三层区别

    都是三层,前者是View,Controller,Model,后者是UI,BLL,DAL。三层目的在于解耦和,是一个系统整体的解耦,但是MVC侧重的是web系统的解耦,之前大家都接触过ASP.NET开发吧,里面有个ASPX前台用HTML来写的,后台是C#.cs也就是说是一个类。现在有了MVC,说它是一种框架是不准确的,更准确的身份是一种设计模式。


2.传统web和MVC区别


    传统页面请求是根据请求的报文,会创建一个对应的页面类对象,在服务器端是不存在这个aspx页面的。类里面会执行load的代码,会输出我们请求的页面中的内容,通过IIS传回到浏览器,返回的是html+js+css。再来看MVC的请求过程,区别于传统的webform处理方式,它发送了一个index而不是index.aspx。之后根据路由配置来解析URL,并创建对象,调用index的方法。一般会通过view()方法来返回一个视图。






3.Post和Get传值的区别


   从字面意思来看,get是向服务器的请求来获取数据。Post是向服务器传递数据。根据二者的区别,我认为get方法更适合查询,而post方法更适合添加,修改或删除。




4.EF操作数据库


   之前我们都是用SQL语句直接对数据库进行操作,而这个EF实体框架实现了完全不需要对数据库直接操作,而是对实体操作。每个通过EF数据上下文操作的实体对象,都保存到上下文的容器中,一旦使用了某个方法,这个时候就会给这个数据加上一个标签,当我们使用savechanges方法的时候,上下文就会遍历容器中的所有实体对象,根据实体身上的标签来进行sql操作。



什么时候使用EF:

• All -in-1框架的类映射表,需要编写映射代码, 并且是很难维护的。 
• 易于理解的代码,无需创造大的数据访问层。 
• 提供LINQ查询数据库。


什么的情况下,不建议使用EF:
• 实时的应用程序。 
• 通过存储过程访问。
• 频繁插入操作(Insert)
• 频繁更新操作,更新的目标主要是当多行(用一个单值) 
• 高性能的复杂查询,对性能有特别的要求。


5.使用MVC+EF进行修改

    在MVC模式的View中,我们可以直接通过这个工具类(HtmlHelper)来读取数据实体值,给Html标签赋值。在上面的代码中就用到了Htmlhelper来绑定数据到控件上面:<td>@Html.TextBoxFor(a=>a.ATitle)</td>中就是BlogArticle实体的一个属性指定到了这个控件上面,多说一句,这种写法是拉姆达表达式,EF查询就是使用拉姆达表达式进行表示的。



Modify.cshtml:

  @using (Html.BeginForm("Modify", "Home", FormMethod.Post))    {        <table id="tbList">            <tr>                <td colspan="2">修改 @Html.HiddenFor(a=>a.AId)</td>            </tr>            <tr>                <td>标题:</td>                @*<td>@Html.TextBox("txtName",(object)Model.ATitle)</td>*@                <!--使用HTMLHelper的强类型的方法 直接从Model中根据Atitle属性生成文本框-->                <td>@Html.TextBoxFor(a=>a.ATitle)</td>            </tr>            <tr>                <td>分类:</td>                <td>@Html.DropDownListFor(a=>a.ACate,ViewBag.CateList as IEnumerable<SelectListItem>)</td>            </tr>            <tr>                <td>内容:</td>                @*<td>@Html.TextBox("txtName",(object)Model.ATitle)</td>*@                <!--使用HTMLHelper的强类型的方法 直接从Model中根据Atitle属性生成文本框-->                <td>@Html.TextAreaFor(a=>a.AContent,10,60,null)</td>            </tr>            <tr>                <td colspan="2"><input type="submit" value="确定修改" /> @Html.ActionLink("返回","Index","Home")</td>            </tr>        </table>    }


HomeController:

    [HttpPost]        #region 0.5执行修改 +ActionResult Modify(BlogArticle model)    /// <summary>        /// 0.5执行修改        /// </summary>        /// <param name="model"></param>        /// <returns></returns>        public ActionResult Modify(BlogArticle model)        {            try            {                //1.将实体对象加入EF对象容器中,并获取伪包装类对象                DbEntityEntry<BlogArticle> entry = db.Entry<BlogArticle>(model);                //2.将包装类对象的状态设置为unchanged                entry.State = System.Data.EntityState.Unchanged;                //3.设置 被改变的属性                entry.Property(a => a.ATitle).IsModified = true;                entry.Property(a => a.AContent).IsModified = true;                entry.Property(a => a.ACate).IsModified = true;                //4.提交到数据库                db.SaveChanges();                //5.更新成功,则命令浏览器重定向到Home/List 方法                return RedirectToAction("Index", "Home");            }            catch (Exception ex)            {                return Content("删除失败------" + ex.Message);            }        }     #endregion        }

6.总结


    6.1 如果开发任务紧张,看着别人的代码,写自己的线,是效率最高的学习方法

    6.2 实践过后不要忘记补自己的理论

    6.3 如果是自己一个人开发一个模块,也要去跟别人一起讨论框架的使用




2 0
原创粉丝点击