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的更多相关文章

  1. Asp.net MVC4高级编程学习笔记-视图学习第一课20171009

    首先解释下:本文只是对Asp.net MVC4高级编程这本书学习记录的学习笔记,书本内容感觉挺简单的,但学习容易忘记,因此在边看的同时边作下了笔记,可能其它朋友看的话没有情境和逻辑顺序还请谅解! 一. ...

  2. Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101

    MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method ...

  3. Asp.net MVC4高级编程学习笔记-视图学习第三课Razor页面布局20171010

    Razor页面布局 1)  在布局模板页中使用@RenderBody标记来渲染主要内容.比如很多web页面说头部和尾部相同,中间内容部分使用@RenderBody来显示不同的页面内容. 2)  在布局 ...

  4. [ASP.NET MVC4高级编程] 学习记录(一)

    理论: 先有GUI在发展,当用户按下某个键,某个进程会监听到这个动作,这个进程就是控制器.这就是MVC模式. 后来有了事件驱动编程,响应动作的是按钮本身,而不是控制器. 再后来webForm中,事件驱 ...

  5. 【Android开发学习笔记】【第四课】基础控件的学习

    通过一个简单的例子来学习下面几种控件: 1.TextView:简单的文本显示控件 2.EditText:可以编辑的文本框 3.Button:按钮 4.Menu:这里指的是系统的Menu 5.Toast ...

  6. 【批处理学习笔记】第十四课:常用DOS命令(4)

    系统管理at 安排在特定日期和时间运行命令和程序shutdown立即或定时关机或重启taskkill结束进程(WinXPHome版中无该命令)tasklist显示进程列表(Windows XP Hom ...

  7. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...

  8. ASP.NET MVC5 高级编程 第3章 视图

    参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...

  9. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

随机推荐

  1. java :equals()和hashcode()方法的结合使用

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  2. Java :BufferedWriter类和BufferedReader类的构造方法、主要方法

    BufferedWriter 和 BufferedReader 为带有默认缓冲的字符输出输入流,因为有缓冲区所以效率比没有缓冲区的高. 一.BufferedWriter 类 构造方法:buffered ...

  3. 分布式一致性算法Raft

    什么是分布式一致性? 我们先来看一个例子: 我们有一个单节点node,这个节点可以是数据库,也可以是一台服务器,当client向node发送data时,X节点收到data,记录下来 由此可见对于单个节 ...

  4. shell脚本命令,一些你在书上找不到的命令。

    1.!$<!$是一个特殊的环境变量,它代表了上一个命令的最后一个字符串.如:你可能会这样: $mkdir mydir$mv mydir yourdir$cd yourdir 可以改成: $mkd ...

  5. [06] Java的数据类型

    1.基本数据类型 1.1 基本数据类型 byte.chart.short.int.long.float.double.boolean 共8种数据类型为基本数据类型: 数据类型     位数     取 ...

  6. 如何使用sourcetree 或 IDEA 自带的git合并代码?

    如何将本地的wyy分支合并并推送到远端的 develop分支? 规则:最好是本地的分支wyy推送到对应的远端origin/wyy ,不建议直接推送到远端不同的分支!!所以 基本思路如下: 1.本地的w ...

  7. svn服务器配置与客户端的使用

    1, Apache Subversion 官网下载地址: http://subversion.apache.org/packages.html#windows 官网下载提供的一般都是最新版本的,如果想 ...

  8. JVM菜鸟进阶高手之路十(基础知识开场白)

    转载请注明原创出处,谢谢! 最近没有什么实战,准备把JVM知识梳理一遍,先以开发人员的交流来谈谈jvm这块的知识以及重要性,依稀记得2.3年前用solr的时候老是经常oom,提到oom大家应该都不陌生 ...

  9. 使用gc、objgraph干掉python内存泄露与循环引用!

    Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问 ...

  10. oracle sql 树操作

    语法:select-start with-connect by-prior 主要有两点 1)prior放在子节点端,则表示扫描树是以start with指定的节点作为根节点从上往下扫描.可能对应一个或 ...