Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027
MVC模型
一、构建基架。
MVC中的基架可以为应用程序提供CURD各种功能生成所需要的样板代码。在添加控制器的时候可以选择相应的模板以及实体对象来生成相应的模板代码。
首先定义一个模型类如下所示:
namespace LYG.HelloWorld.Models
{
public class Album
{
public virtual int AlbumId { get; set; }
public virtual string Title { get; set; }
public virtual decimal Price { get; set; }
public virtual Artist Artist { get; set; }
}
public class Artist
{
public virtual int ArtistId { get; set; }
public virtual string Name { get; set; }
}
}
然后选择添加控制器,选择相应的基架,这里列出来的有好多种不同的基架。
再点下一步选择相应的模型和数据上下文,如下图所示,然后点添加按钮。
这样在生成的控制器中会生成CURD的各种操作代码以及视图文件也会同时生成,大大简化了工作量,提高了工作效率。这里因为刚接触基架还不明白各种基架的优缺点,后续将单独进行学习比较,选择适合自己项目的基架。
二、基架和实体框架。
1、代码优先约定;
开发变得更轻松,通过代码的方式来产生需要存储的数据结构。
2、DbContext类;
当使用代码优先开发方式时,需要使用EF的DbContext类派生出一个类来访问数据库。这个类有一个或多个DbSet<T>的属性。每一个T表示要持久的对象。如:
public class MusicStoreDB:DbContext
{
public MusicStoreDB():base("DefaultConnection")
{ }
public DbSet<Album> albums { get; set; }
public DbSet<Artist> artists { get; set; }
然后控制器如下所示访问数据库:
var db = new MusicStoreDB();
var allAlbums = from album in db.albums
orderby album.Title ascending
select album;
return View(allAlbums.ToList());
}
最后视图读取数据:
@model IEnumerable<LYG.HelloWorld.Models.Album>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) |
@Html.ActionLink("Details", "Details", new { id=item.AlbumId }) |
@Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })
</td>
</tr>
}
</table>
三、初始化数据库
在开发过程中经常变更数据结构,如果想要重新生成新的数据结构字段,需要初始化数据库,可以在Global.asax.cs文件中增加如下代码:
Database.SetInitializer(new DropCreateDatabaseAlways<MusicStoreDB>());
这样每次启动应用程序时都会重新构建数据,但这样会存在一个问题,有部分初始化的基础数据都会清空,因此便于测试,需要进行数据库播种。如下代码所示:
public class MusicStoreDBInitializer: DropCreateDatabaseAlways<MusicStoreDB>
{
protected override void Seed(MusicStoreDB context)
{
context.artists.Add(new Artist { Name="李小卫"});
context.albums.Add(new Album { Title="汪峰2018演唱会", Price=, Artist= new Artist { Name = "李小卫" } });
base.Seed(context);
}
}
Global.asax.cs中增加如下代码:
Database.SetInitializer(new MusicStoreDBInitializer());
注意这里本人测试结果是执行到删除数据库的时候提示数据库正在使用,然后删除异常,还未找到原因。这是程序抛出的异常:Cannot drop database "MusicStoreDB" because it is currently in use.
四、模型绑定
以前asp.net webform的通用写法是通过Request.Form[“Title”]类似这样获取传输过来的参数值。如果表单字段类型过多,感觉就会变得冗长泛味。Asp.net MVC可以通过表单元素的命名与模型实体的名称相同,这样就可以通过一个实体参数来获取所传输过来的所有字段类型。
1、默认模型绑定DefaultModelBinder,代码如下:
[HttpPost]
//注意这里的参数是通过album中的属性与视图表单中的元素命名一致的控件传输过来的参数值。
public ActionResult Edit(Album album)
{
if (ModelState.IsValid)
{
musicDB.Entry(album).State = EntityState.Modified;
musicDB.SaveChanges();
return RedirectToAction("Index");
}
return View(album);
}
注意通过这种模型绑定器会绑定所有album中的参数,这样会增加“重复提交”攻击的风险,可以设置一两个属性不使用模型绑定器来设置,将在后面的学习中学习到,需要牢记这个威胁。
2、显示模型绑定UpdateModel,如果模型无效UpdateModel会抛出一个异常来,代码如下:
[HttpPost]
public ActionResult Edit()
{
var album = new Album(); //注意声明一个实例
try
{
UpdateModel(album); //显示模型绑定
musicDB.Entry(album).State = EntityState.Modified;
musicDB.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View(album);
}
}
3、显示模型绑定TryUpdateModel,如果模型无效UpdateModel不会抛出一个异常来,但会返回true或false来表示模型是否有效,代码如下:
[HttpPost]
public ActionResult Edit()
{
var album = new Album();//注意声明一个实例
If(TryUpdateModel(album)) //显示模型绑定
{
musicDB.Entry(album).State = EntityState.Modified;
musicDB.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(album);
}
}
模型绑定的副产品就是模型状态,因此也可以这样写:
[HttpPost]
public ActionResult Edit()
{
var album = new Album();//注意声明一个实例
TryUpdateModel(album)
If(ModelState.IsValid) //显示模型绑定
{
musicDB.Entry(album).State = EntityState.Modified;
musicDB.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(album);
}
}
模型知识到此就学习完了,接下来学习模型状态如何使用HTML辅助方法、MVC验证特性和模型绑定一起工作。
Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027的更多相关文章
- Asp.net MVC4高级编程学习笔记-视图学习第一课20171009
首先解释下:本文只是对Asp.net MVC4高级编程这本书学习记录的学习笔记,书本内容感觉挺简单的,但学习容易忘记,因此在边看的同时边作下了笔记,可能其它朋友看的话没有情境和逻辑顺序还请谅解! 一. ...
- Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101
MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method ...
- Asp.net MVC4高级编程学习笔记-视图学习第三课Razor页面布局20171010
Razor页面布局 1) 在布局模板页中使用@RenderBody标记来渲染主要内容.比如很多web页面说头部和尾部相同,中间内容部分使用@RenderBody来显示不同的页面内容. 2) 在布局 ...
- [ASP.NET MVC4高级编程] 学习记录(一)
理论: 先有GUI在发展,当用户按下某个键,某个进程会监听到这个动作,这个进程就是控制器.这就是MVC模式. 后来有了事件驱动编程,响应动作的是按钮本身,而不是控制器. 再后来webForm中,事件驱 ...
- 【Android开发学习笔记】【第四课】基础控件的学习
通过一个简单的例子来学习下面几种控件: 1.TextView:简单的文本显示控件 2.EditText:可以编辑的文本框 3.Button:按钮 4.Menu:这里指的是系统的Menu 5.Toast ...
- 【批处理学习笔记】第十四课:常用DOS命令(4)
系统管理at 安排在特定日期和时间运行命令和程序shutdown立即或定时关机或重启taskkill结束进程(WinXPHome版中无该命令)tasklist显示进程列表(Windows XP Hom ...
- ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法
参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...
- ASP.NET MVC5 高级编程 第3章 视图
参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...
- Node.js高级编程读书笔记Outline
Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...
随机推荐
- HTML结构
HTML:超文本标记语言. 可以放除了文本之外的内容,像图片.音频.视频等 由很多标签组成 html基本结构: <html> <head> 头标签存放网页信息,编码格式等 &l ...
- Eclipse rap 富客户端开发总结(4):如何搭建 rap 中文开发环境
Rap中文开发环境搭建大约分为2个部分 1. rap国际化,详细参加文章(rap开发经验总结(5)-rap国际化之路) 2.rap自带的JFace ,Dialog 等国际化 1.中文包下载地址: h ...
- expect实现scp/ssh-copy-id非交互
expect工具可以实现自动应答,从而达到非交互的目的. expect具体使用用法比较复杂,中文手册我正在翻译中,以后翻译完了做了整理再补.本文只有几个ssh相关最可能用上的示例. yum -y in ...
- 纳税服务系统【信息发布管理、Ueditor、异步信息交互】
需求分析 我们现在来到了纳税服务系统的信息发布管理模块,首先我们跟着原型图来进行需求分析把: 一些普通的CRUD,值得一做的就是状态之间的切换了.停用和发布切换. 值得注意的是:在信息内容中,它可以带 ...
- ResourceManager的HA
大家都知道在hadoop2中对HDFS的改进很大,实现了NameNode的HA:也增加了ResourceManager.但是ResourceManager也可以实现HA.你没看错,确实是Resourc ...
- cocos2dx 中触摸事件分发一些解读
触摸事件分发中几个代码解读: 怎么说呢,感觉cocos2dx中的消息分发机制,相对于android中触摸事件分发机制要简单的多.因为android中要做区域判断,过滤器,以及父子组件分发给谁等等的逻辑 ...
- CDS测试框架介绍:如何为ABAP CDS Entities写测试
动机 现在大家都知道单元测试对我们代码的好处.并且我们都承认它是开发过程中不可或缺的一部分.但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到A ...
- 深入浅出数据结构C语言版(21)——合并排序
在讲解合并排序之前,我们先来想一想这样一个问题如何解决: 有两个数组A和B,它们都已各自按照从小到大的顺序排好了数据,现在我们要把它们合并为一个数组C,且要求C也是按从小到大的顺序排好,请问该怎么做? ...
- JAVA多线程--Thinking in java
聊聊并发:http://ifeve.com/java-concurrency-thread-directory/ 阻塞状态: sleep 可中断利用 interrupt方法 wait IO 不可中 ...
- JSP 入门
request是请求,即客服端发来的请求. response是响应,是服务器做出的响应 redirect页面重定向 forward页面跳转 不改变url 四个作用域 如果把变量放到pageContex ...