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. 201521123049 《JAVA程序设计》 第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  2. 201521123113《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  3. java继承涉及的动/静态绑定及隐藏

    项目中经常会用到java多态这个特性,之前只知道一些皮毛,现在发现自己对它并没有一个系统的认识,想从新梳理下自己的基础库. 看了java编程思想中对象导论,关于继承的描述:java中的类型不仅仅只是描 ...

  4. 接口测试入门(2)--get和post初级请求/使用httpclient做一个获取信息list的请求(需要登录才可以)

    抛去测试自动化的架构来,直接写单个测试用例的思路如下: 1.获取测试case的接口,对每一个接口的请求方式(get/post/delete/put)进行分析,是否需要参数(不同的用例设置不同的参数,如 ...

  5. temp-mootools简单语法

    // mootools // auditFlag = $(this).getElement('>td input[id="auditFlag"]').val() // .ge ...

  6. JDBC在javaweb中的应用之分页数据查询

    分页查询 分页查询是java web开发中经常使用到的技术.在数据库中数据量非常大的情况下,不适合将所有的数据全部显示到一个页面中,同时为了节约程序以及数据库的资源,就需要对数据进行分页查询操作. 通 ...

  7. PeopleRank

    PeopleRank:基于PageRank的理论,以每个微博账户的“关注”为链出链接,“粉丝”为链入链接的这种以人为核心的关系. PeopleRank假设条件:– 数量假设:如果一个用户节点接收到的其 ...

  8. StringBuffer的替换和反转和截取功能

    A:StringBuffer的替换功能 * public StringBuffer replace(int start,int end,String str): * 从start开始到end用str替 ...

  9. HTTP库Axios

    前面的话 本文将详细介绍HTTP库Axios 概述 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 [安装] 在Vue中使用,最好安装两个模块axios ...

  10. Sequence query 好题啊

    Sequence query Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Subm ...