• MVC知识进阶01


    下面是在项目中有关于MVC的知识总结,有些地方若不对,请指出。

    一:MVC的基本知识

    1 名词解释

       *惯例优先原则<约定大于配置>:是一种开发设计模式,说是在项目里面使用事先规定的命名方式来使用命名。这是设计开发的惯例。

       *路由规则:每一次的程序的运行,都会先看路由规则,按照路由规则来运行。

    2 模型绑定

       先说一下我对这个的理解,将视图里面要使用到的模型放在Action的参数里面,看其返回值是什么?在视图页面要引用这样的模型,然后我们在浏览器端填写数据这样就直接保存到模型<类>里面,之后在Action里面就可以将模型里面保存的值取出使用。

    一般在类型名后面加?表示这个属性可以为空。但是为空不等于为0,      例如:public decimal ? Guid{get;set;};

    3 对于在控制器里面用ViewData和ViewBeg将数据引到前台的区别。

       @ViewData         将数据保留在外面,而且浏览器在访问到这里的时候还需要确定类型。

       @ViewBag          将暴露的ViewData放到一个dynamic中。

    4 当我们在前台对数据进行验证的时候,在Action里面就可以用到ModelState.IsValid来看数据字典里面是否有值。

    MVC里面的数据验证。在Models的属性上面可以进行一些数据的验证。

        [Required]:必填字段;

        [Display(Name=”小辉”)]:名为小辉

        [StringLength(50)]:提交的数据长度不能小于50.

        [Rang(1,1000)]:字段的范围在1--1000之间<字段是一些表是范围的属性>

        [Rang(Typeof(DateTime),”1/1/2012”,”12/31/9999”)]:表示气日期在一个特定的范围里面。

        [ErrorMessage=“这是错误的信息”]:自定义的错误信息

    5 对于刚开始时,使用弱类型现在使用强类型而言,我们应该在以后的开发中使用强类型,这样子可以减少代码的错误率,而且强类型若是小的地方出错,只会在前台出现已错部分的错误,而弱类型就会全部报错,程序就会执行不下去。

    6 MVC的自动装配功能很强大,比如说传参数,但到达Action之后框架就会自动的将参数装配到自定的位置。

    7: Url是通过类名加方法名组成的

       Model:是指要处理的业务代码和数据操作代码;

       View视图:主要是指和用户打交道并且可以展示数据;

       Controller:model和view基本上是没有任何联系的,而此时Controller的作用就是二者的桥梁。

    8 在Controller里面我们通过View()传递一个集合到前台页面,我们可以在前面将那个Model定义为IEnumerable<>接口类型,这是一个公开的枚举类型,这样子就可以直接进行.操作符。

    二:项目中具体知识点

    1:封装数据上下文<就是将其放在工厂里面,一种设计模式>

      在dal层封装数据上下文,每次用到工厂,必须按自己指定的模式进行应用。

       public partial class ContextFactory
        {
           /// <summary>
           /// 将数据上下文添加到数据槽中,这样子每次访问的时候直接使用这个就行了,而且
           /// 这样子也可以利于GC进行删除。
           /// </summary>
           /// <returns></returns>
           public static DbContext GetContext()
           {
               var context = CallContext.GetData("OAContext")
                   as DbContext;                 //getdata数据是从数据槽中去数据,而下面的setdata是往数据槽里面放数据。
               if(context==null)
               {
                   context=new ABlogContainer();
                   CallContext.SetData("OAContext", context);
               }
               return context;
           }
        }

    数据槽:线程里面唯一独享的集合。可以保证一次请求就是形成线程,

    2:类之间的传递使用泛型来进行传递。通过子类来告诉父类应该使用什么类型。

    例子就是dal层里面的baseDal代码,就是声明一个父类将其进行封装,使用的时候直接使用父类中的代码就行。

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ABlog_DAL
    {
        /// <summary>
        /// 增加代码的重用   这里就是类的封装,将每个类访问数据库的CRUD都封装起来,成为一个基类,
        /// 数据库中模型每次访问数据库的时候直接进行调用就行。
        /// </summary>
       public partial class BaseDal<T>        //将父类设计成泛型类   子类在调用的时候说明使用那个实体就行。
           where T:class       //这里的where进行说明T是个引用类型
        {
            //ABlogContainer dbcontext=new ABlogContainer();
            private DbContext dbcontext = ContextFactory.GetContext();    //这里是从工厂里面使用ef里面的数据上下文
            /// <summary>
            /// 增加
            /// </summary>
            /// <param name="userInfo"></param>
            /// <returns></returns>
            public int Add(T userInfo)
            {
                dbcontext.Set<T>().Add(userInfo);
                return dbcontext.SaveChanges();
            }
            /// <summary>
            /// 修改
            /// </summary>
            /// <param name="userInfo"></param>
            /// <returns></returns>
            public int Edit(T userInfo)
            {
                dbcontext.Entry(userInfo).State = EntityState.Modified;
                return dbcontext.SaveChanges();
            }
    
            /// <summary>
            /// 修改  根据id  数组  实体
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public int Remove(int id)
            {
                T u1 = dbcontext.Set<T>().Find(id);
                dbcontext.Set<T>().Remove(u1);
                return dbcontext.SaveChanges();
            }
    
            public int Remove(T userInfo)
            {
                dbcontext.Set<T>().Remove(userInfo);
                return dbcontext.SaveChanges();
            }
    
            public int Remove(int[] array)
            {
                int arraylength = array.Length;
                for (int i = 0; i < arraylength; i++)
                {
                    T u2 = dbcontext.Set<T>().Find(array[i]);
                    dbcontext.Set<T>().Remove(u2);
                }
                return dbcontext.SaveChanges();
            }
            /// <summary>
            /// 查询  通过id lamdbam条件 
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public T GetById(int id)
            {
                return dbcontext.Set<T>().Find(id);
            }
    
            public IQueryable<T> GetList(Expression<Func<T, bool>> whereLamdba)
            {
                return dbcontext.Set<T>().Where(whereLamdba);
            }
            /// <summary>
            /// 分页查询
            /// </summary>
            /// <typeparam name="TKey">按列进行查询</typeparam>
            /// <param name="whereLamdba">条件lamdba</param>
            /// <param name="orderLamdba">按什么顺序</param>
            /// <param name="pageSize">页面大小</param>
            /// <param name="pageIndex">页面个数</param>
            /// <returns></returns>
            public IQueryable<T> GetPageList<TKey>(Expression<Func<T, bool>> whereLamdba, Expression<Func<T, TKey>> orderLamdba,
                int pageSize, int pageIndex)
            {
                return dbcontext.Set<T>().Where(whereLamdba)
                    .OrderBy(orderLamdba)
                    .Skip((pageIndex - 1) * pageSize)
                    .Take(pageSize);
            }
        }
    }

    下面是使用泛型来传递的

    using System.Data;
    using System.Data.Entity;
    using System.Linq.Expressions;
    using ABlog_IDAL;
    using ABlog_Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ABlog_DAL             //调用底层的代码进行CRUD <数据的操作>
    {
        /// <summary>
        /// IUserInfoDal 里面是接口,但是前面的BaseDal已经帮着实现了
        /// </summary>
        public partial class ABlogDal:BaseDal<UserInfo>,IUserInfoDal
        {
    
        }
    }

    3:关于业务逻辑层<Service>解耦

    体现了<低耦合高内聚>

    ***思考一下,我们为什么要解耦呢??

    原因:service层里面名称的变化,访问数据库变化,表的变化。

    解耦:从这两个方面进行

        1:声明对象,实例化对象。

    wps516C.tmp

     

  • 相关阅读:
    第四周作业及总结
    第三周作业及其总结
    第二周作业及总结
    我所敬佩的老师
    秋季学习总结
    自我介绍
    寒三总结
    2019春第7周作业
    2019春第六周作业
    2019春第五周作业
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/4906836.html
Copyright © 2020-2023  润新知