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:声明对象,实例化对象。

 

时间: 2024-10-11 11:03:56

MVC知识进阶01的相关文章

《跟老男孩学Linux运维之shell编程实战》-第三章 shell变量知识进阶

本文讲解shell变量知识进阶. 以下为知识点的总结,关于练习,本文不不涉及,还需要各位小伙伴自己练习! 1.shell中的特殊位置参数变量,请见下表: 在企业场景下,"$?"的用法: (1)判断命令.脚本或函数等程序是否执行成功: (2)若在脚本中调用执行"exit 数字",则会返回这个数字给"$?"变量: (3)如果是在函数里,则通过"return  数字",把这个数字以函数返回值的形式传给"$?".

汇编语言学习(基础知识)01

汇编语言(基础知识)01 1.  汇编语言得主体是汇编指令.汇编指令和机器指令的差别在于指令的表示方法上.汇编指令是机器指令便于记忆的书写格式. 2.  操作 机器指令 汇编指令 3.  汇编语言的组成: (1)       汇编指令:机器码的助记符,有对应的机器码. (2)       伪指令:没有对应的机器码,由编译器执行,计算机并不执行. (3)       其他符号:如+.-.*./等,有编译器识别,没有对应的机器码. 4.  存储器 cpu是计算机的核心部件,他控制整个计算机的运行并进

【WinForm,MVC】基础01

WinForm的一些基础知识,用来回忆自己忘记的历史,唤醒自己的知识. 虽然现在有MVC但是我觉得还是要学习一下WinForm的,毕竟以前也被大家用了好多年. 基础知识01 1:一个控件有很多的事件,每个事件都有很多的事情要做,主要是通过_click的事件来控制的. 点击按钮调用TextBox的Hide方法,调用控件的方法控件就会发生动作.而此方法是使这个小窗口消失隐藏. 2:将String类型的转换为int类型                    string a;             

MVC知识总结(前序)

距离2015年的来临还有1天的时间,是时候总结一下今年的经过脑子的知识了,由于今年里工作中接触MVC的时间特别多,所以打算针对MVC这个东西的知识进行一个总结,好歹对得起在几个项目中用了MVC来进行开发. 原先在博客园中看了许多的MVC教程,大体对MVC有个了解的程度,但是没经过项目练手始终觉得生疏,今年几个项目中架构师一直推崇MVC的使用,于是对MVC有了中等强度的使用,经过观看大神Artech的MVC框架揭秘之后学到了更多,于是有了今天写总结的动机.将来博文可能依照下图的顺序进行编写,希望自

MVC知识汇总

ASP.NET MVC绪论 MVC与ASP.NET MVC基础概念 MVC是Model-View-Controller的缩写. MVC将应用程序划分为3大组件:模型\视图\控制器. MVC不是ASP.NET所特有,它只是一种开发理念.java中的struts2也是一种MVC模型. ASP.NET MVC从2008年发布1.0版以来,截至2014年ASP.NET MVC最新版本已经是5.0. ASP.NET MVC从1.0版开始,就已经开放源代码(源码地址:aspnetwebstack.codep

Spring笔记(基础知识)01

1.基础知识 01.Spring:轻量级Java EE开源框架,它是由Rod Johnson为了解决企业应用程序开发的复杂性而创建. 02.目标:实现一个全方位的整合框架,实现"一站式"的企业应用开发. 03.内容: a.IoC容器 b.AOP实现 c.数据访问支持:简化JDBC/Hibernate编码    声明式事务 d.Web集成 04.Spring设计理念 Spring是面向bean的编程,IoC(Inversion of Control) ,AOP(Aspect Orient

spring MVC拦截器01

spring MVC拦截 作用:身份校验,权限检查,防止非法訪问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法添加分类,无法删除博文. spring MVC 拦截实现分为2步 (1)编写拦截器类,必须继承org.springframework.web.servlet.HandlerInterceptor 核心方法: public boolean preHandle(HttpServletRequest request, HttpServ

MVC学习笔记-01

什么是MVC MVC是指(Model-View-Controll即模型-视图-控制器)用于表示表示一种软件架构模式,它把软件分成三个基本的部分:模型(Model),视图(view),控制器(Controller). MVC模式与我们熟悉的.NET webForm模式有什么不同呢? 先看普通的webFrom模式下,我们请求一个路径http:www.szmali360.com/bolg/index.aspx的Url,那么我的WebFor程序会到网站的根目录小去寻找index.aspx文件,然后由in

ASP.NET MVC 路由进阶(之二)--自定义路由约束

3.自定义路由约束 什么叫自定义路由约束呢?假如路由格式为archive/{year}/{month}/{day},其中year,month,day是有约束条件的,必须是数字,而且有一定范围. 这时候,我们就可以设置约束类,进行自定义路由约束了. 第一步: 我们先添加年份限制类 YearRouteConstraint.请看代码: using System; using System.Collections.Generic; using System.Linq; using System.Web;