MVC基础学习—理论篇

  1.      简介

    ?  定义?什么是MVC

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

    ?  VC模式和我们熟悉的WebForm模式

技术分享

      看上面的这两幅图,上面的那一幅图是web请求方式,下面的那个是mvc模式,我们可以看出,第一种web方式客户端向浏览器发送一个请求:比如:www.itcast.cn/index.aspx;浏览器向服务器发送报文请求,服务器端的framework创建一个页面的对象,将输入的数据进行处理后输出html或其他的内容,最后将处理后的数据渲染成为html或者js或者css的形式返回给客户端浏览器进行显示。传统web开发是输入一个网址,请求的是一个页面类

      而第二种方式是MVC方式,同样是向服务器发送请求比如www.itcast.cn/news/index,不同于传统的web形式,在服务器framework中,根据路由配置,将传过来的url进行解析,创建news对象,并且调用对象的index方法,在方法中进行数据的处理,并且将结果存储咋视图中,最后将结果渲染为html或者js或者css形式以视图的形式返回给客户端浏览器。mvc是请求页面类中的一个方法,之后将数据传输到视图中进行显示。

      看下面的这两种图更为清晰:

      传统web形式:

技术分享

      Mvc模式:

技术分享

    2.      内部详解

      ?  程序的访问路径

      从上面的图上我们可以看出,在MVC中,客户端的所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Model中取数据,然后再由Controller选择合适的View返回给客户端。

    新建一个小的程序:新建解决方案,之后添加一个控制器,里面的代码如下:

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using MVCBlog.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCBlog.Controllers
{
    //1.控制器类(继承了Controller)
    public class HomeController : Controller
    {
        //创建一个数据集合(伪数据)
        

        #region 0.1初始化数据集合+ void InitData()
        /// <summary>
        /// 初始化数据集合
        /// </summary>
        public List<Models.Dog> InitData()
        {
            List<Models.Dog> list = new List<Models.Dog>() { 
                new Dog(){ID=1,Name="小样~~"},
                new Dog(){ID=2,Name="小样2~~"},
                new Dog(){ID=3,Name="小样3~~"},
                new Dog(){ID=4,Name="小样4~~"}
            };
            return list;

        } 

         #endregion


        //2.Action方法(可以看成MVC设计模式的Model)
        public ActionResult Index()
        {

            //定义一个容器,并且设计容量
            System.Text.StringBuilder sbHtml = new System.Text.StringBuilder(4000);
            // 2.1读取当前的业务,比如读取数据库、判断等等)
            //2.1创建一个数据集合,获取当前数据
            List<Models.Dog> list = InitData();
            //2.1.1遍历集合,生成html代码,并且存入到sbHtml中
            list.ForEach(d =>
            {
                sbHtml.AppendLine("<div>" + d.ToString() + "</div>");
            });
            //使用viewBag传递数据给同名的Index.cshtml
            //viewBag是一个dynamic类型集合,可以动态添加任何类型的任意名称的属性和值

            ViewBag.Htmlstr = sbHtml.ToString();
            //2.3加载同名视图Index.cshtml
            return View();
        }

      
    }
}
</strong></span>

       之后在Models里面添加一个dog类,代码如下:

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCBlog.Models
{
    public class Dog
    {
        public int ID { get;set; }
        public string Name { get; set; }
        public override string ToString() {
            return "ID=" + this.ID + ",Name=" + this.Name;
        }


    }
}</strong></span>

      在index方法上鼠标右击添加视图,视图的代码如下:


<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>

<body>
  @ViewBag.HtmlStr
</body>
</html>
</strong></span>

      直接运行即可:效果如下图:

技术分享

        我们看到无论是访问前者的地址还是后者的地址,内容是一样的,说明默认情况下访问的就是http://localhost:9711/Home/index

技术分享

       我们注意到地址栏的URL是 Home/Index,如果按照我们前面说的WebForm的模式的话,我们应该可以在我们的项目的根目录下找到Home目录,然后Home目录下有个Index的文件,但是我们并不能在根目录下找到Home这个目录。不过还是让我们在Views目录下找到了Views/Home/Index.aspx文件,我们输入这个地址运行看看:

技术分享

      为什么会这样呢,路径是正确的,但是显示不出来,怎么回事呢?我们来解析一下吧。

      ?  MVC运行机制

     为什么输入路径看似正确却出错呢?

     前面我们看到即使输入的路径是正确的,但是还是出错了,怎么回事呢?

      我们打开Views文件夹的配置文件,其实这个文件夹下还有一个配置文件的,

技术分享

       这就解决了为什么前面我们直接访问Views/Home/Index.aspx这里文件的时候会出现404错误,说找不到文件呢?因为在MVC中,是不建议直接去访问View的,所以当我们访问时,也就是访问Views目录下的所有的文件都会由System.Web.HttpNotFoundHandler因此我们不要将资源文件(CSS、JS、图片等)放到Views目录中。

      为什么前两种的输入都能出来最后结果呢?

      在MVC中,客户端的所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Model中取数据,然后再由Controller选择合适的View返回给客户端。

      当我们运行的ASP.NET MVC程序访问的这个URL,它其实访问的是HomeController中的Index这个Action。

技术分享

         那么为什么第一个地址也是可以访问啊,http://localhost:9711原因在于MVC的路由机制,我们看看路由的配置:

技术分享

      我们可以看到这里定义了一个名为"Default"的Route,还定义了默认的参数。默认参数的意义在于,当我们访问例如http://localhost:9711的URL的时候,他会将不存在的参数用默认的参数补上,也就是相当于访问http://localhost:9711/Home/Index一样。故而会出现上面的两种相同的结果。

    ?  MVC核心部件

技术分享

      在MVC设计模式中,Model是指要处理的业务逻辑和数据操作;View视图主要是指的跟用户打交道并且显示给用户看的;Controller看成是Model和View的桥梁。

      第一个Controller也即是控制器

      很多人在问Model在哪里,是不是就是建立出来的Models文件夹下的呢,其实/Home/action方法可以看成是MVC设计模式的Model,因为这个方法会根据建立在Models中的类或者一些数据进行操作。

      第二个是Models

      学过三层可能不会陌生,三层中的实体就是这个东东,那他们一样吗?有相同的,也有区别,我们不仅仅可以定义实体,同样我们可以建立数据模型,也即是EF(EntityFramework);也即是ORM(对象关系映射框架/数据持久化框架)根据实体对象操作数据表中数据的一种面向对象的操作框架,底层也是调用ADO.Net.

      第三个是Views

       客户端浏览器发送的请求经过Controller的中方法index处理后由Controller选择合适的View返回给客户端。主要是呈现给用户看的。

  3.      总结

      这里只是自己初步学习的理解,这里主要讲述的是理论,下篇会讲解一些应用还有其他的知识。请继续关注~



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。