概述

在 ASP.NET MVC 框架中,模型(Model)是负责核心应用程序或业务逻辑的应用程序部件。 模型对象通常从诸如 SQL Server 之类的永久存储区(如数据库)中访问数据,并对该数据执行业务逻辑。

模型特定于应用程序,因此 ASP.NET MVC 框架对您可以生成的模型对象的种类没有限制。 例如,您可以使用 ADO.NET DataSet 或 DataReader 对象,或者可以使用一组自定义的域对象。 您也可以使用对象类型的组合来处理数据。总之:处理数据的办法是多样的只要您选择适合您的其中一种即可。

模型不是特定的类或接口。 类是模型的一部分,这并不是因为它可以实现某接口或派生自某基类。 而是由于类在 ASP.NET MVC 应用程序中发挥的作用,以及类在应用程序文件夹结构中的存储位置的缘故。 ASP.NET MVC 应用程序中的模型类不直接处理来自浏览器的输入,也不生成到浏览器的 HTML 输出。

定义模型

模型对象是实现域逻辑(也称为业务逻辑)的应用程序部件。 域逻辑可处理在数据库与 UI 之间传递的数据。 例如,在库存系统中,模型将跟踪存储区中的物品以及用于确定库存中是否有某个物品的逻辑。 此外,模型将是在物品卖出并从仓库中发货时对数据库进行更新的应用程序部件。 通常,模型还将在数据库中存储和检索模型状态。

集成模型和控制器

通常我们创建Model都是在 ASP.NET MVC 应用程序模板中 Visual Studio 提供的 Models 文件夹中创建。

但是,通常也会将模型类存放在单独的程序集中,比如单独的类库,以便我们可以在不同的应用程序中重复使用这些类。

MVC中Model和View的分离,使应用程序的逻辑元素保持分离,这样就可以轻松地测试应用程序逻辑,而不必通过用户界面测试该逻辑。

创建Model

右击MVC项目中的Model文件夹--> 选择添加-->类

将其命名为Person

添加类代码

    public class Person    {/// <summary>/// 编号/// </summary>        public int ID { get; set; }

/// <summary>/// 姓名/// </summary>        public string Name { get; set; }

/// <summary>/// 年龄/// </summary>        public int Age { get; set; }    }

好了 目前我们一个简单的Model已经添加好了 但是我们还没有使用他,下面我们接着来学习如何使用该Model。

列表页面

创建PersonController

鼠标右击Controller文件夹-->添加控制器

程序默认生成了Index方法,明眼的你一眼就能发现,该方法要返回的View还没有创建,所以我们创建他对应的View

右击该方法---选择添加视图

点击添加后,可以看到,VS已经给我们把PersonList的Razor视图代码都写好了。。。(*^__^*) 嘻嘻愉快。。。

迫不及待了 点击运行。。。哦哦 看不到Person的主页

此时我们可以把Global.asax里面的默认controller改为Person即可。或者做导航。。后面介绍

代码如下

            routes.MapRoute("Default", // 路由名称                "{controller}/{action}/{id}", // 带有参数的 URL                new { controller = "Person", action = "Index", id = UrlParameter.Optional } // 参数默认值            );

再次运行。。。继续报错。。Model未将对象。。。实例

回头想想 其实是我们没有给View传送数据而已。。

那么我们给他一个模拟数据。这里也可以从数据库读取!!!

Controller代码

         /// <summary>/// 获取数据/// </summary>/// <returns>PersonList</returns>        IEnumerable<Person> GetData()        {            IEnumerable<Person> list = new List<Person>                           {new Person() {ID = 1001, Name = "张三", Age = 20},new Person() {ID = 1002, Name = "李四", Age = 22}                           };return list;        }

//// GET: /Person/

public ActionResult Index()        {return View(GetData());        }

修改后的View代码

@model IEnumerable<MvcApplication.Models.Person>@{    ViewBag.Title = "人员列表";    Layout = "~/Views/Shared/_Layout.cshtml";}<h2>    人员列表</h2><table><tr><th>            姓名</th><th>            年龄</th><th></th></tr>    @foreach (var item in Model)    {<tr><td>                @item.Name</td><td>                @item.Age</td><td>                @Html.ActionLink("修改", "Edit", new { id = item.ID }) |                @Html.ActionLink("明细", "Details", new { id = item.ID }) |                @Html.ActionLink("删除", "Delete", new { id = item.ID })</td></tr>    }</table><p>    @Html.ActionLink("创建人员", "Create")</p>

运行效果

明细页面

Controller代码

        //// GET: /Person/Details/5

public ActionResult Details(int id)        {foreach (var person in GetData())            {if (person.ID.Equals(id))                {return View(person);                }            }return View();        }

View代码
@model MvcApplication.Models.Person

@{    ViewBag.Title = "人员明细";    Layout = "~/Views/Shared/_Layout.cshtml";}

<h2>人员明细</h2>

<fieldset><legend>人员信息</legend>

<div class="display-label">姓名:</div><div class="display-field">@Model.Name</div>

<div class="display-label">年龄:</div><div class="display-field">@Model.Age</div></fieldset><p>    @Html.ActionLink("编辑", "Edit", new { id=Model.ID }) |    @Html.ActionLink("返回列表", "Index")</p>

运行效果

 创建人员
在PersonController新建Create方法
        //// GET: /Person/Create

public ActionResult Create()        {return View();        }

创建视图

生成的视图代码

@model MvcApplication.Models.Person@{    ViewBag.Title = "创建人员";    Layout = "~/Views/Shared/_Layout.cshtml";}<h2>    创建人员</h2><script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script><script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>@using (Html.BeginForm()){    @Html.ValidationSummary(true)<fieldset><legend>人员信息</legend><div class="editor-label">            @Html.LabelFor(model => model.ID)</div><div class="editor-field">            @Html.EditorFor(model => model.ID)            @Html.ValidationMessageFor(model => model.ID)</div><div class="editor-label">            @Html.LabelFor(model => model.Name)</div><div class="editor-field">            @Html.EditorFor(model => model.Name)            @Html.ValidationMessageFor(model => model.Name)</div><div class="editor-label">            @Html.LabelFor(model => model.Age)</div><div class="editor-field">            @Html.EditorFor(model => model.Age)            @Html.ValidationMessageFor(model => model.Age)</div><p><input type="submit" value="创建" /></p></fieldset>}<div>    @Html.ActionLink("返回列表", "Index")</div>

虽然有了 页面有了初始方法

但是我们还没有写他的数据保存方法。。。

继续在PersonController里面写Create方法不过这次要在方法上面加上[HttpPost]确保该方法只能在界面发送数据的时候执行。

        //初始化视图// GET: /Person/Create

public ActionResult Create()        {return View();        }

//只用于接受页面发过来的Http请求// POST: /Person/Create

        [HttpPost]public ActionResult Create(Person person)        {try            {//操作数据的代码                return RedirectToAction("Success",person);            }catch            {return View();            }        }

/// <summary>/// 用于显示添加人员成功/// </summary>/// <param name="person"></param>/// <returns></returns>        public string Success(Person person)        {return "删除用户成功!姓名:"+person.Name;        }

因为我们没有和数据库交互,所以跳转到了一个Success的方法,输出成功语句。。

运行效果

点击创建之后

修改人员信息

与新增页面类似我们创建修改的初始页面Edit

        //初始页面// GET: /Person/Edit/5

public ActionResult Edit(int id)        {return View();        }

添加视图

生成的代码

@model MvcApplication.Models.Person@{    ViewBag.Title = "修改人员";    Layout = "~/Views/Shared/_Layout.cshtml";}<h2>    修改人员</h2><script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script><script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>@using (Html.BeginForm()){    @Html.ValidationSummary(true)<fieldset><legend>人员信息</legend>        @Html.HiddenFor(model => model.ID)<div class="editor-label">            @Html.LabelFor(model => model.Name)</div><div class="editor-field">            @Html.EditorFor(model => model.Name)            @Html.ValidationMessageFor(model => model.Name)</div><div class="editor-label">            @Html.LabelFor(model => model.Age)</div><div class="editor-field">            @Html.EditorFor(model => model.Age)            @Html.ValidationMessageFor(model => model.Age)</div><p><input type="submit" value="保存" /></p></fieldset>}<div>    @Html.ActionLink("返回列表", "Index")</div>

添加保存代码,还是继续返回上面的Success方法
        //初始页面// GET: /Person/Edit/5

public ActionResult Edit(int id)        {return View();        }

//修改方法// POST: /Person/Edit/5

        [HttpPost]public ActionResult Edit(int id, Person person)        {try            {// 数据库操作代码

return RedirectToAction("Success",person);            }catch            {return View();            }        }

运行效果

点击保存后

删除人员

在PersonController中添加方法

 //// GET: /Person/Delete/5

public ActionResult Delete(int id)        {return View();        }

添加删除视图

生成的视图代码

@model MvcApplication.Models.Person@{    ViewBag.Title = "删除人员";    Layout = "~/Views/Shared/_Layout.cshtml";}<h2>    删除人员</h2><h3>    你确定要删除该人员?</h3><fieldset><legend>人员信息</legend><div class="display-label">        编号</div><div class="display-field">@Model.ID</div><div class="display-label">        姓名</div><div class="display-field">@Model.Name</div><div class="display-label">        年龄</div><div class="display-field">@Model.Age</div></fieldset>@using (Html.BeginForm()){<p><input type="submit" value="删除" />        |        @Html.ActionLink("返回列表", "Index")</p>}

添加删除代码

        //// GET: /Person/Delete/5

public ActionResult Delete(int id)        {foreach (var person in GetData())            {if (person.ID.Equals(id))                {return View(person);                }            }return View();        }

//// POST: /Person/Delete/5

        [HttpPost]public string Delete(int id, Person person)        {return "已删除编号为" + id + "的人员";        }

运行效果

点击删除

总结

MVC开发基本步骤

一:添加Model对应的Controller

二:在Controller创建操作Model的方法

三:根据创建的方法添加视图,并选择视图模板等

四:修改VS生成的视图代码,如加CSS样式等操作

五:添加按钮的Post方法,必须以该视图名称命名,参数不能和初始化视图的参数一样。

六:调试代码。

下节预告

MVC 3.0 数据有效性之Model验证

作者:记忆逝去的青春
出处:http://www.cnblogs.com/lukun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过http://www.cnblogs.com/lukun/  联系我,非常感谢。

转载于:https://www.cnblogs.com/lukun/archive/2011/07/29/2120699.html

我要学ASP.NET MVC 3.0(八): MVC 3.0 传递和保存你的Model相关推荐

  1. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

    我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述      众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括 ...

  2. ASP.NET Core launchsettings.json文件(8)《从零开始学ASP.NET CORE MVC》:

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core 进程外(out-of-process)托管 ASP.NET Core launchsetting ...

  3. 《从零开始学ASP.NET CORE MVC》课程介绍

    大家好,欢迎来到52ABP学院,收看我们的 <从零开始学ASP.NET CORE MVC>. ASP.NET Core 简介 从2015年开始随时互联网成长,云计算和AI.大数据的爆发,大 ...

  4. 跟我学ASP.NET MVC之五:SportsStrore开始

    跟我学ASP.NET MVC之五:SportsStrore开始 摘要: 这篇文章将介绍一个ASP.NET应用程序SportsStore的开发过程. 开始 创建解决方案 创建工程 在New ASP.NE ...

  5. ASP.NET Core appsettings.json文件(9)《从零开始学ASP.NET CORE MVC》:

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core launchsettings.json文件 ASP.NET Core appsettings.j ...

  6. ASP.NET Core 进程外(out-of-process)托管(7)《从零开始学ASP.NET CORE MVC》

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core 进程内(InProcess)托管 ASP.NET Core 进程内(InProcess)托管 我 ...

  7. ASP.NET Core 进程内(InProcess)托管(6)《从零开始学ASP.NET CORE MVC》:

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core 中的 Main方法 ASP.NET Core 进程内(InProcess)托管 在这个视频中我们 ...

  8. 《从零开始学ASP.NET CORE MVC》:ASP.NET Core 中的 Main方法(5)

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core Web 项目文件 ASP.NET Core 中的 Main方法 一个开始专心写字的人 在ASP. ...

  9. 合适么?现在学ASP.NET Core入门编程……

    现在都快找不到ASP.NET的培训课程了. 知道我要开课做培训,有同学劝我:"憋讲那什么.NET,讲Java,现在这个火!"我说我Java不熟,"唉呀!C#转Java,分 ...

最新文章

  1. mysql连接池为何不用nio_MyCAT 在 Cobar 的基础上,完成了彻底的 NIO 通讯,并且合并了两个线程池...
  2. 神经网络 | Mask Scoring R-CNN:实例分割综述
  3. 通用路由封装(GRE)×××配置
  4. Jakarta EE,EE4J和Java EE之间的关系
  5. 美甲帮:数加平台打造大数据架构
  6. 两个音轨合并_两个双音轨mkv视频合并保持原双音轨不变 MKV怎么合并视频,合并之后仍保留MKV的双音轨...
  7. [C#]WinFrom中的DataGrid单击选择行
  8. 面试题,如何让你从0-1的做一款产品出来,你会怎么做?
  9. ExecutorService--线程池
  10. 51nod 1009 数字1的数量
  11. Mac项目流程管理工具:OmniPlan Pro 4.4
  12. 自学JAVA-11:IO流
  13. 句子匹配 无监督_在无监督的情况下创建可解释的句子表示形式
  14. 利用IPC$空连接进行入侵及防范的方法
  15. Java实现微信轰炸
  16. VSCode安装教程(超详细)
  17. 1067 Sort with Swap(0, i)
  18. 中国气象站点数据、降雨量气温蒸散发栅格数据集
  19. HASH和HMAC(7):SHA3-224/256/384/512算法原理
  20. 《扫黑风暴》全网爆火!用Python具体分析一下它怎么火起来的?你喜欢看吗?

热门文章

  1. xfce不小心禁用了鼠标
  2. 台式电源GX450的开关O和-到底什么意思
  3. Django的静态文件路径设置对比
  4. hexo的yelee主题使用自定义字体并用字蛛进行字体压缩的sed脚本
  5. 安装cadence ic5141时碰到字体问题
  6. php用go做跳转翻页,go.php跳转不输出权重的跳转方式真的有用么?
  7. 深度学习(二十四)——L2 Normalization, Attention(1)
  8. 机器学习问题方法总结
  9. 方差为什么用平方不用绝对值_为什么炖鸡汤,人们喜欢用母鸡而不用公鸡?原来差别这么大!...
  10. Maven仓库搭建(二):GitHub、又拍云、七牛云存储