【Dongle】【MVC】MVC框架学习

6 篇文章 0 订阅
1 篇文章 0 订阅

MVC

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

       其运作原理如下图:


Controller

        控制器,是用来处理业务的,可以处理用户的请求,调用数据层,处理业务,并将数据传给视图。例如:

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

            System.Text.StringBuilder sbHtml = new System.Text.StringBuilder(4000);
            //2.1处理当前业务(比如读取数据库,判断等)
            //2.1.1创建一个数据集合(伪数据),获取数据

            List<Models.Dog> list = InitData();
            //2.1.2遍历集合,生成html代码,存入sbHtml
            list.ForEach(d =>
            {
                sbHtml.AppendLine("<div>" + d.ToString() + "</div>");
            });

            //  ViewBag.Message = "修改此模板以快速启动你的 ASP.NET MVC 应用程序。";
            //2.1处理当前业务(比如读取数据库,判断等)

            //2.2使用ViewBag传输数据给 同名 Index.cshtml视图
            //viewbag是以 dynamic类型集合,可以动态的添加任意类型的任意名称的属性和值
            ViewBag.HtmlStr = sbHtml.ToString();//HtmlStr为任意名称
            //2.3 加载同名视图Index.cshtml
            return View();
        }
        /// <summary>
        /// 数据上下文对象
        /// </summary>
        OumindBlogEntities db = new OumindBlogEntities();

        #region  0.2查询 文章 列表 + ActionResult Index()
        /// <summary>
        /// 查询 文章 列表
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            //1.查询 数据库里的 文章数据(通过 EF 执行)
            try
            {
                List<Models.BlogArticle> list = (from d in db.BlogArticles where d.AIsDel == false select d).ToList();
                //2 将集合数据传给视图
                //ViewBag.DataList = list;//自定义属性方式
                ViewData["DataList"] = list;//使用键值对的方式

                //3.加载视图
                return View();
            }
            catch (Exception ex)
            {
                return Content("请刷新页面~~~~" + ex.Message);//用来输出提示内容
            }
        }


         return view()是默认将数据传给当前action对应的View视图,如果在里面加入参数,则是传到了了参数对应的视图中,比如,View(“About”),就是将数据传给了当前目录下所存在的About视图中。用户看到的将是About视图内容。

         对了,另外指出,View中可以传字符串,也可以传Model。如果是传字符串,作用就是上面说的跳转指定视图的功能。如果是传的Model,则是将model返回到当前action多对应View的视图上去。在View页面上可以接受视图。

        通过上面我们还可以了解到如何将数据传递给View,这里有三种方法:

        #region 0.4显示要修改的数据 + ActionResult Modify(int id)
        [HttpGet]//设置方法标记
        /// <summary>
        /// 0.4显示要修改的数据
        /// </summary>
        /// <param name="id">要修改的文章的id</param>
        /// <returns></returns>
        public ActionResult Modify(int id)
        {
            //1.根据id 查询数据库,返回的集合中 拿到 第一个 实体对象
            BlogArticle art = (from a in db.BlogArticles where a.AId == id select a).FirstOrDefault();//获取list中的第一个对象
            //2.生成 分类 下拉框 列表集合 <option value="1">文本</option>
           //隐式转换成SelectListItem
            IEnumerable<SelectListItem> listItem = (from c in db.BlogArticleCates
                                         where c.IsDel == false select c).ToList()
                                         .Select(c=> new SelectListItem { Value = c.Id.ToString(), Text = c.Name });
            //Linq语句不支持其它方法,只允许有属性
            
            //将生成的文章分类 下拉框选项集合 设置给 ViewBag
            ViewBag.CateList = listItem;

            //2.将 art 传递 给 视图显示
            //ViewBag  设置属性  
            //第一种方法:通过ViewBag集合传输
            //viewbag是以 dynamic类型集合,可以动态的添加任意类型的任意名称的属性和值
            ViewBag.HtmlStr = sbHtml.ToString();//HtmlStr为任意名称


            //第二种方法:通过ViewData容器传输
            //ViewData:是一个字典容器,可以将控制器的数据传递给页面     
            ViewData["DataList"] = list;//使用键值对的方式


            //第三种方法:通过Model传输
            BlogArticle art = (from a in db.BlogArticles where a.AId == id select a).FirstOrDefault();//获取list中的第一个对象
            //*“加载”视图*使用 View的构造函数, 将 数据 传给 视图上的  名为 Model 的属性
            return View(art);
        }

View

        视图,主要是将Controller传回来的值显示给用户,是简洁的HTML页面。获取数据的方法(与controller传输对应):

        //第一种ViewBag显示数据
        @ViewBag.CateList  //Controller给ViewBag设定的什么属性,就调用什么属性,其中的数据就会显示出来

        //第二种ViewData显示数据
        @ViewData["Key1"]  //Controller为ViewData设置的键值对,找到对应的键,则对应的值同样会显示出来
         
        //第三种Model显示数据
        //在View视图的开头,需要先引入Model类型
        @model MVCBlog.Models.BlogArticle  //Model类型是BlogArticle类型  
         @Html.TextAreaFor(a => a.AContent,10,60,null) //则其中的a就是Model模型——BlogArticle的模型实体


       在视图页面,还有对Html的封装(HtmlHelper),让我们可以非常方便的使用HTML中的控件。当然也可以进行扩展,实现我们满意的效果。

       甚至在视图上提交的表单,会自动将前台页面数据装配到控制器中(表单中Name属性与参数相同的action中,无论是复杂的,还是简单的参数)

       //Controller中
       public ActionResult Index(string txtName,string txtPwd,UserInfo userInfo){}

        //View页面
        <form id="form1" method="post" action="" enctype="application/x-www-form-urlencoded"><!--如果没有输入action,则从哪来回哪去-->
            <table>
                <tr>
                    <td>用户名:</td>
                    <td><input type="text" name="txtName" /></td>
                </tr>
                <tr>
                    <td>密码:</td>
                    <td><input type="password" name="txtPwd" /></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <input type="submit" value="提交" />
                    </td>
                </tr>
            </table>
        </form>

Model

       模型,与数据库打交道,与之前我们学到的Model有相同,但也不同。相同的是,这里也是实体模型。但不同的是,这里的视图是对应数据库表的,当然也可以自己创建实体类,并且还进行与数据库交互的功能。与数据库的交互可以通过EF自动生成模型,并且还能自动生成关系图,更加方便直接,甚至如果表中存在外键,也能直接生成外键属性,极大的方便了我们进行级联操作。例如BlogArticle

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码已从模板生成。
//
//     手动更改此文件可能导致应用程序出现意外的行为。
//     如果重新生成代码,将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------

namespace MVCBlog.Models
{
    using System;
    using System.Collections.Generic;
    
    //EF 按照模型生成的实体类
    public partial class BlogArticle
    {
        public int AId { get; set; }
        public int ACate { get; set; }
        public int AAuthor { get; set; }
        public string ATitle { get; set; }
        public string AContent { get; set; }
        public string AImgsrc { get; set; }
        public int APlnum { get; set; }
        public bool AAllowPL { get; set; }
        public bool AIsTop { get; set; }
        public string ATag { get; set; }
        public int ACick { get; set; }
        public int AStatu { get; set; }
        public System.DateTime AAddtime { get; set; }
        public System.DateTime AUpdatetime { get; set; }
        public bool AIsDel { get; set; }
        public string AHtmlSrc { get; set; }
        
        //三个 外键属性
        public virtual BlogArticleCate BlogArticleCate { get; set; }
        public virtual BlogUser BlogUser { get; set; }
        public virtual Enumeration Enumeration { get; set; }
    }
}

总结MVC

1、约定大于规定

2、耦合性低

3、重用性高

4、可维护性高

5、部署快

6、视图与控制器间的过于紧密连接

7、视图对模型数据的低效率访问











评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值