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. 201521123113《Java程序设计》第12周学习总结

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

  2. 201521123012 《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1. ...

  3. Linux系统常用的文件查看及处理命令

    常用的文本查看及处理命令 1.cat命令 (1).作用 连接文件并打印到标准输出设备上,cat经常用来显示文件的内容. (2).用法 1):用法:cat  (参数) 文件 2):常用参数 -n或-nu ...

  4. 小巧玲珑:机器学习届快刀XGBoost的介绍和使用

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张萌 序言 XGBoost效率很高,在Kaggle等诸多比赛中使用广泛,并且取得了不少好成绩.为了让公司的算法工程师,可以更加方便的 ...

  5. 02函数-05-generator(ES6)

    generator(生成器)是ES6标准引入的新的数据类型. generator看上去像一个函数,但可以返回多次,除了return语句,还可以用yield返回多次.定义方式如下: function* ...

  6. Spring - bean的lazy-init属性(懒加载)

    默认情况下,容器初始化的时候便会把bean实例化,通常这样做可以让一些配置或者bean实例化的异常在容器启动的时候就发现,而不是在N久之后.但有时候,我们希望某个可能不会用到但又不是100%不用的be ...

  7. A glimpse of Support Vector Machine

    支持向量机(support vector machine, 以下简称svm)是机器学习里的重要方法,特别适用于中小型样本.非线性.高维的分类和回归问题.本篇希望在正篇提供一个svm的简明阐述,附录则提 ...

  8. java基础解析系列(六)---深入注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer ja ...

  9. java注解生成xml和包含CDATA问题

    百度java生成xml,有一大推的文章,主要的生成方式一种使用Dom4J ,还有一种使用Jdk自带注解类! 下面主要整理我注解类的使用,(可以参考这篇文章Dom4J生成xml和包含CDATA问题)和x ...

  10. Java客户端调用.NET的WebService

    项目需要去调用.NET的WebSrevice,本身是Java,研究了半天,终于有些头绪,记下来. 1,新建.NET WebService.只在原方法上加上一个string类型的参数str [WebMe ...