.NET Web开发之.NET MVC框架介绍

MVC概念

MVC是一种架构设计模式,该模式主要应用于图形化用户界面(GUI)应用程序。那么什么是MVC?MVC由三部分组成:Model(模型)、View(视图)及Controller(控制器)。

Model即应用程序的数据模型。任何应用程序都离不开数据,数据可以存储在数据库中、磁盘文件中,甚至内存中。Model就是对这些数据的抽象,不论数据采取何种存储形式,应用程序总是能够通过Model来对数据进行操作,而不必关心数据的存储形式。数据实体类就是常用的一种Model。例如,一个客户管理应用程序使用数据库来存储客户数据,数据库表中有一个客户表Customer,相应的程序中一般会建立一个数据实体类Customer来与之对应,这个实体类即使客户表的Model。

View是应用程序的界面。用户通过View来操作应用程序,完成与程序的交互。View提供了可视化的界面来显示Model中定义的数据,用户通过View来操作数据,并将对Model数据操作的结果返回给用户。在桌面应用程序中,View可能是一个或多个Windows窗体。在Web应用程序中,View是由一系列网页构成,在ASP.NET网站中即为.aspx页面。

Controller 定义了程序的应用逻辑。用户通过View发送操作命令给Controller,由Controller按照程序设计的逻辑来更新Model定义的数据,并将操作结果通过View返回给用户。

MVC的历史

MVC这一概念最早由美国教授Trygve Reenskaug于1979年提出。1988年MVC这一设计模式正式在《A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk -80》一书中提出。伴随着微软Windows操作系统的迅速发展与普及,图形化用户界面应用程序逐渐成为主流,很多编程语言都出现了MVC框架,以方便开发人员使用该模式来设计应用程序。这些框架中大部分都是针对Web应用程序。

.NET Web开发中MVC设计模式的实现

ASP.NET 1.x中使用了CodeBehind技术,彻底终结了传统ASP程序开发的梦魇:程序逻辑与HTML界面元素混杂在一起。CodeBehind技术将代表程序界面(View)的.aspx文件与逻辑(Controller)代码.vb/.cs文件的分离即是一种MVC式的设计。ASP.NET 2.0中又出现了CodeBeside技术,即一个.aspx文件可以有多个.vb/.cs文件,这又方便了界面与逻辑代码的进一步分离。

2008年3月微软发布了针对ASP.NET 3.5 的MVC框架 (Preview 2 版本)。这是一个真正意义上的ASP.NET MVC框架。该框架可以说是对之前为开发人员所熟悉的基于Web Form的应用程序开发方式的"颠覆"。变化可谓"震撼":

1. 使用URL Routing技术:Web程序的URL不再是指向具体的物理页面.aspx,而是指向某个Controller的某个方法。一个典型的MVC架构的程序,其URL可能如下所示:

http://www.mysite.com/Customer/Index

使用该MVC架构的程序其URL不必有文件扩展名。上面这个URL中的Customer即为Controller的名字。而Index是Customer定义的一个方法名。

2. Web程序的界面.aspx不再使用服务器端的Form:

<asp: form runat="server"></form>

那么与服务器端的Form相关的Postback以及页面生命周期的事件也不存在了。

3. 页面中不再有View State。MVC下将不能使用View State来存储程序状态信息。

4. 不再提供依赖于服务器端Form的服务器控件事件,开发人员熟悉的Button_Clicked事件在MVC下将不再需要。

NET MVC示例

安装完 ASP.NET MVC Preview 2后,VS2008中会添加一个新的项目模板"ASP.NET MVC Web Application", 如下图所示

新建该项目后, VS2008自动生成项目的文件结构如下, MVC三个组成部分各有一个文件夹来存储各自的程序文件。

前面提到的URL Routing即在Global.asax.cs中设置:


代码如下:

public class GlobalApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            // 注意: IIS7以下的IIS版本需将URL格式设置为 "{controller}.mvc/{action}/{id}" to enable

routes.Add(new Route("{controller}.mvc/{action}/{id}", new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(new { action = "Index", id = "" }),
            });//设置URL Routing格式

routes.Add(new Route("Default.aspx", new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(new { controller = "Customer", action = "Index", id = "" }),
            });//设置默认URL指向Customer Controller的Index方法
        }

protected void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes(RouteTable.Routes);
        }
}

【代码1】:Global.asax.cs

下面来实现Customer 的Model、Controller及View:

Model: 在项目中的Model文件夹下,新建一个"Linq to SQL Classes",将Northwind数据库中的Customer表拖拽到其设计视图中。这样就完成了Customer对应的Model。如图4

Controller: 在项目中的Controller文件夹下,新建一个"MVC Controller Class",命名为CustomerContoller.cs。 在此类中添加一个公有方法Index,此方法及为在Global.asax.cs中设置好的默认URL所映射的方法。

代码如下:

public class CustomerController : Controller
      {
        public void Index(string id)
        {
            Northwind.Models.NorthwindDataContext dc = new Northwind.Models.NorthwindDataContext();
            IList<Northwind.Models.Customer> customers = dc.Customers.Take(10).ToList();//取数据库中的10个Customer记录
            RenderView("Index", customers);//返回Index View
        }
}

【代码2】:CustomerController.cs

View: 上面Index方法的代码表示CustomerContoller的Index方法执行后,需要返回一个名称为Index的View,以便将数据呈现给用户。下面来添加这个Index View:在项目的View文件中,新建一个子文件夹Customer。与Customer Controller有关的View将保存在此文件夹下。新建一个"MVC View Class"并命名为Index.aspx。在前面的RenderView("Index", customers)方法中,customers参数是Controller传递给View所需的数据,该参数的类型为IList<Northwind.Models.Customer>。为了在View中方便使用此强类型的数据,View.aspx.cs使用了如下代码:注意粗体部分

代码如下:

public partial class Index : ViewPage<IList<Northwind.Models.Customer>>
    {
}

【代码3】:Index.aspx.cs

View.aspx代码如下:ViewData这一成员变量的类型及为上面提到的IList<Northwind.Models.Customer>类型。

代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Edit.aspx.cs" Inherits="Northwind.Views.Customer.Edit" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <div>
        <table>
            <tr>
<td>Edit</td>           
            <td>Customer ID </td>
            <td>Company Name </td>
            <td>Contact Name </td>
            <td>Contact Title </td>
           </tr>  
            <% foreach (Northwind.Models.Customer customer in ViewData)
               {%>
               <tr>
                  <td><a href="Customer.mvc/Edit/<%= customer.CustomerID %>">Edit</a></td><!—URL指向Customer Contoller的Edit方法 -->
                  <td></td>
                  <td>  <%= customer.CustomerID %></td>
                  <td> <%= customer.CompanyName  %></td>
                  <td> <%= customer.ContactName  %></td>
                  <td><%= customer.ContactTitle  %></td>

</tr>
               <%} %>
        </table>
    </div>
</body>
</html>

【代码4】:Index.aspx

下面来实现Customer Controller的Edit方法。在CustomerController.cs中添加如下代码:

代码如下:

public void Edit(string id)
{
            Northwind.Models.NorthwindDataContext dc = new Northwind.Models.NorthwindDataContext();
            Customer c = dc.Customers.Single(cus => cus.CustomerID == id);//从数据库中取出参数id所对应的的一个Customer记录

RenderView("Edit", c);//返回Edit View

【代码5】:CustomerController.cs中的Edit方法

相应的在项目中的View/Customer/文件夹下,添加Edit View Edit.aspx:

代码如下:

public partial class Edit : ViewPage<Northwind.Models.Customer>
{
}

【代码6】:Edit.aspx.cs

代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Edit.aspx.cs" Inherits="Northwind.Views.Customer.Edit" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
<!—下面的 html form 将用户的输入提交到Customer Contoller的Update方法 -->
<%using( Html.Form<Northwind.Controllers.CustomerController>(cc=>cc.Update(ViewData.CustomerID))){ %>
    <div>
       Customer ID: <%= ViewData.CustomerID  %> <br />
       Company Nmae: <%= Html.TextBox("Customer.CompanyName", ViewData.CompanyName) %> <br />
       Contact Name: <%= Html.TextBox("Customer.ContactName",ViewData.ContactName) %><br />
       Contact Title: <%= Html.TextBox("Customer.ContactTitle",ViewData.ContactTitle) %>
    </div>
    <%= Html.SubmitButton("Save") %>
    <%} %>
</body>
</html>

【代码7】:Edit.aspx

代码7中使用了MVC框架中的一个帮助类Html。此类可以生产View中常用的界面元素,例如 html form,文本输入框等。

下面来实现CustomerController的Update方法:

代码如下:

public void Update(string id)
        {
            Northwind.Models.NorthwindDataContext dc = new NorthwindDataContext();
       //从数据库中取出参数id所对应的的一个Customer记录:
            Customer cust = dc.Customers.Single(c => c.CustomerID == id);
      //将Edit View中的用户的更改赋值到cust对象:
            BindingHelperExtensions.UpdateFrom(cust, Request.Form);
            dc.SubmitChanges();
            RedirectToAction("Index");//跳转到Index View
        }

【代码8】:CustomerController.cs中的Update方法

上面的代码通过ASP.NET MVC框架实现了Customer的列表、编辑及更新功能,可以看出MVC将应用程序的Model、View及Controller三部分"优雅的"分离,真正实现了高内聚、低耦合的灵活架构,大大降低了程序的复杂性,提高了可扩展性及可重用性。这一框架对Web开发带来的影响不仅是是技术上的变化,更是Web程序设计思想的变化 -- Web程序不再是一些列功能页面的集合,而是又Controller控制的功能单元的集合,Web程序更像是一组通过其URL对外开放的"API"。

(0)

相关推荐

  • asp.net mvc下拉框Html.DropDownList 和DropDownListFor的常用方法

    一.非强类型: Controller: ViewData["AreId"] = from a in rp.GetArea()                                select new SelectListItem {                                Text=a.AreaName,                                Value=a.AreaId.ToString()                   

  • asp.net MVC实现无组件上传图片实例介绍

    例子: 如我想上传一个图片到服务器端:asp页面 复制代码 代码如下: <form id="form1" runat="server" action="/bookIndex/fileUpLoad/(你准备处理的 ActionResult)" method="post" enctype="multipart/form-data"> <input type="file" i

  • 使用asp.net MVC4中的Bundle遇到的问题及解决办法分享

    背景    之前有过使用MVC3的经验,也建过MVC4的基本样例看过,知道有bundle这么一个方法. 近日想建个网站使用MVC4,但是我觉得在基本样例上改不好,有太多无用的东西,所以就建了一个空白的MVC的程序,然后自己写需要的东西, 将程序的目标框架从4.5降到了4.0(我使用的是VS2013),问题就来了. 问题及解决办法 1.降了目标框架之后,vs报一个警告:NuGet程序包是使用不同于当前目标框架的目标框架安装的,需要更新System.Web.Http,之前有用过NuGet, 但是只是

  • ASP.NET.4.5.1+MVC5.0设置系统角色与权限(一)

    数据结构 权限分配 1.在项目中新建文件夹Helpers 2.在HR.Helpers文件夹下添加EnumMoudle.Cs 复制代码 代码如下: namespace HR.Helpers {     public enum EnumMoudle     {         /// <summary>         /// 模块         /// </summary>         [EnumTitle("用户管理")]         SysUserM

  • Asp.net实现MVC处理文件的上传下载功能实例教程

    上传于下载功能是程序设计中非常常见的一个功能,在ASP.NET程序开发中有着非常广泛的应用.本文就以实例形式来实现这一功能. 一.概述 如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUpload就是其中一个,而这个控件的缺席给我们带来一些小问题.这篇文章主要说如何在Asp.net MVC中上传文件,然后如何再从服务器中把上传过的文件下载下来. 二.实现方法 1.文件上传

  • asp.net如何进行mvc异步查询

    查询是项目中必不可少的工作,而且不同的项目不同的团队,都有自己的简单方法.Asp.net mvc 有自己独特的优势,下面是结合mvc实现一个产品列表的Demo. 问题描述 对于一些列表页面,保持一致的查询代码. 解决方案 1.依赖文件jquery.js.jquery.unobtrusive-ajax.js. 2.创建部分视图,PartialView主要存放服务器发送过来的数据. 3.一个包含集合数据的viewmodel. 部分视图代码基本如下: asp.net怎样进行mvc异步查询? 问题讨论

  • .NET Web开发之.NET MVC框架介绍

    MVC概念 MVC是一种架构设计模式,该模式主要应用于图形化用户界面(GUI)应用程序.那么什么是MVC?MVC由三部分组成:Model(模型).View(视图)及Controller(控制器). Model即应用程序的数据模型.任何应用程序都离不开数据,数据可以存储在数据库中.磁盘文件中,甚至内存中.Model就是对这些数据的抽象,不论数据采取何种存储形式,应用程序总是能够通过Model来对数据进行操作,而不必关心数据的存储形式.数据实体类就是常用的一种Model.例如,一个客户管理应用程序使

  • Python web开发之用Tornado框架制作简易表白墙网站

    目录 前言 Tornado框架简单介绍 Tornado框架优势 Tornado框架缺点 Tornado框架使用场景 框架的组成 开始先试下Tornado 先导入本次要用的模块 视图 设置路由 设置前端socket,调用 运行程序,先试试水 设置主页,调用前端文件模板 设置 表白墙视图 留言 前言 今天我们要用Python做Web开发,做一个简单的[表白墙]网站.众所周知表白墙的功能普遍更多的是发布找人,失物招领,还是一个大家可以跟自己喜欢的人公开表白的平台 Tornado框架简单介绍 在Pyth

  • Java开发之ssm三大框架整合

    目录 1.springmvc 2.spring-dao.xml与mybatis-config.xml 3.spring-service.xml 4.引用 1.springmvc 和只有spring-mvc时一样,web.xml spring-mvc.xml spring-mvc.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/

  • SpringBoot整合Web开发之Json数据返回的实现

    目录 本章概要 返回JSON数据 默认实现 自定义转换器 1. 使用Gson 2. 使用fastjson 静态资源访问 默认策略 自定义策略 1. 在配置文件中定义 2. Java编码定义 本章概要 返回JSON数据 静态资源访问 返回JSON数据 默认实现 JSON 是目前主流的前后端数据传输方式,Spring MVC中使用消息转换器HTTPMessageConverter对JSON的转换提供了很好的支持,在Spring Boot中更进一步,对相关配置做了进一步的简化.默认情况下,创建一个Sp

  • Java Web开发之MD5加密用法分析

    本文实例讲述了Java Web开发之MD5加密用法.分享给大家供大家参考.具体如下: MD5是Message Digest 5的缩写,是一种加密算法,能够对字节数组进行加密,有如下特点: ① 不能根据加密后的信息找加密之前的信息: ② 加密后的结果是128位: ③ 对于给定的字节数组,不管什么时候采用这种加密算法,结果是相同的: ④ 对于不同的字节数组,加密的结果是不相同的. 在Web应用中通常需要对用户设置的密码进行加密之后再存储,否则数据库管理员能够看到明文的密码,并且密码也有被黑客获取的危

  • 移动web开发之touch事件实例详解

    前面的话 iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为iOS设备既没有鼠标也没有键盘,所以在为移动Safari开发交互性网页时,常规的鼠标和键盘事件根本不够用.随着Android 中的WebKit的加入,很多这样的专有事件变成了事实标准,导致W3C开始制定Touch Events规范.本文将详细介绍移动端touch事件 概述 包含iOS 2.0软件的iPhone 3G发布时,也包含了一个新版本的Safari浏览器.这款新的移动Safari提供了一些与触摸(touc

  • IOS开发之@property的详细介绍

    IOS开发之@property的详细介绍 在类中定义属性时,总会使用到@property进行定义,下面就来说说@property的使用. 在使用过程中,如果需求公开且在其他类中使用时,通常会定义在.h头文件中:而如果只是该类自已需要使用,这时则会定义 在.m实现文件中. 使用格式 @property (参数1, 参数2, 参数3, ...) 参数类型 参数名称 参数包括三个种类,七个属性,如下图所示. 在使用过程中,有几点需要注意: (1)原子性定义中,如果没有涉及到多线程环境时,通常不会使用默

  • 比较不错的asp模板引终极讲解(WEB开发之ASP模式)

    作者: 孙立 Email: 17bizAT126.com 写于:2006/3/5 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 http://sunli.cnblogs.com/archive/2006/03/05/343095.html 关键词:ASP 模板 摘要: 阐述一种全新的ASP模板引擎,实现代码(逻辑)层与HTML(表现)层的分离.这种模板实现方法避免了一 般ASP模板加载模板文件(加载组件)和替换所浪费的资源,实现编译型的模板引擎,提高程序的执

  • asp模板引擎终结者(WEB开发之ASP模式)

    阐述一种全新的ASP模板引擎,实现代码(逻辑)层与HTML(表现)层的分离.这种模板实现方法避免了一 般ASP模板加载模板文件(加载组件)和替换所浪费的资源,实现编译型的模板引擎,提高程序的执行速度和稳定性. 内容:        当前,WEB开发已经变得非常火爆,因为各种应用,已经约来越要求表现层和逻辑层的分离.ASP和HTML夹在一起程序将变得难于维护,可读性也差.在PHP领域,模板引擎已经非常普遍,如phplib,SMARTY,等等.有使用替换方式的,也有编译方式的(SMARTY),它们都

  • Web开发之JavaScript

    小引 笔者认为web开发包括设计html,javascript,css,以及一种高级语言,比如c#,java等等,本文分为三部分,第一部分为简单介绍javascript,第二部分为理解ECMAscript,最后部分为为javascript基础,所以针对javascript笔者不是很深理解,只能从下面几点对他进行分析,要是不对,请指出,谢谢!主要内容为: 第一部分: javascript 特点 javascript的实现 ECMAScript标准 javascript的发展 第二部分: 关于 EC

随机推荐