您的位置:首页 > 其它

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

2015-12-06 20:51 399 查看
   之前做项目的时候用过三层架构,是一种分层式的软件体系架构。在这个新的项目中,我第一次接触到了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 如果是自己一个人开发一个模块,也要去跟别人一起讨论框架的使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: