下面是在项目中有关于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:声明对象,实例化对象。

MVC知识进阶01的更多相关文章

  1. SQL Server 进阶 01 数据库的设计

    SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...

  2. id,is的用法,小数据池的概念及编码知识进阶

    一:id 查询内存地址 name = 'alex' print(id(name)) li = [1,2,3] print(id(li)) 二:is  判断的是内存地址 name1 = 'alex@' ...

  3. L011系统文件属性知识进阶详解小节

    L011系统文件属性知识进阶详解小节 这节课的内容相对来说较少,一上午加中午就听完了,现在总结一下,最后会有一个相关的面试题. 首先先附上一张图: 今天学习主要跟①和②有关,①为Inode 号 ②为文 ...

  4. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  5. 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器

    第四章 基础知识进阶第十七节 迭代.可迭代对象.迭代器 一.    引言 本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本节 ...

  6. 【MVC学习笔记01】初窥奥秘

    前言 最近工作落实了,是我非常喜欢的无线前端,会接触很多新东西啦,需要努力才行.因为会用到backbone,所以要学习MVC啦. MVC(模型-视图-控制器),这种模式最早被用于构建桌面程序和服务器端 ...

  7. Asp.net MVC知识积累

    一.知识积累 http://yuangang.cnblogs.com/ 跟蓝狐学mvc教程专题目录:http://www.lanhusoft.com/Article/169.html 依赖注入:htt ...

  8. MVC知识总结(前序)

    距离2015年的来临还有1天的时间,是时候总结一下今年的经过脑子的知识了,由于今年里工作中接触MVC的时间特别多,所以打算针对MVC这个东西的知识进行一个总结,好歹对得起在几个项目中用了MVC来进行开 ...

  9. spring mvc注解版01

    spring mvc是基于servlet实现的在spring mvc xml版中已经说过了,注解版相较于xml版更加简洁灵活. web项目的jar包: commons-logging-1.1.3.ja ...

随机推荐

  1. 开始VS 2012中LightSwitch系列的第3部分:我该选择哪一个屏幕模板

    [原文发表地址]  Beginning LightSwitch in VS 2012 Part 3: Screen Templates, Which One Do I Choose? [原文发表时间] ...

  2. 用JQ仿造百度书籍预售页面的单屏滚页效果

    今天的项目需要做到一个介绍页面,我主动提出走单屏滚页的风格,毕竟交互性好,逼格也高,具体效果可以参照百度知道书籍预售页面. 其实现效果就大概是这样的: 还是老样子,所有步骤文件可以从我的Github上 ...

  3. javascript的执行和预解析

    很久以前遇到过一个面试题目,的的确确是面试官问我的问题,下面是这个问题的代码部分.由于年少无知,没有回答上,被无情pass了. var u ='hello world'; ;(function(){ ...

  4. 【原创】GC/垃圾回收简介

    GC简介 1 GC机制 1.1 对象 从计算机的角度,装有数据的内存空间 1.2 作用 将内存垃圾的释放自动化 1.3 本质 将已经引用不到的对象视为死亡,将死亡的对象找出来并且作为垃圾进行回收 2 ...

  5. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

  6. java算法(二)

    四.最小公倍数最大公约数问题: 分析:两个数的最小公倍数等于两个数相乘再除以他们的最大公约数,因此只要求出最大公约数就可以啦. package JingDian; public class yuebe ...

  7. 自动备份文件到GITHUB的方法

    由于一个制作着玩的项目需要制作上传文件的功能,自己又不是搞网站的,也不想去维护一个服务器. 于是开发了一个上传服务器,可以自动把我上传到服务器的数据同步到Github服务器 而github服务器又提供 ...

  8. Weibo用户地图

    1.1.1 摘要 现在,许多应用都提供地理位置定位的功能,只要用户开放他们的位置信息就可以实现定位了,今天我们将创建一个基于Google 地图的微博用户地图,这里我们将通过Weibo API获取微博用 ...

  9. html5 Web Workers

    虽然在JavaScript中有setInterval和setTimeout函数使javaScript看起来好像使多线程执行,单实际上JavaScript使单线程的,一次只能做一件事情(关于JavaSc ...

  10. 知方可补不足~SqlServer自动备份数据库及清理备份文件

    回到目录 对于SQLSERVER这个关系型数据库来说,为了保持数据的安全,备份是必须的,当你的一个误操作导致数据丢失,这可能是灾难性的,是不被允许发生的,这时,我们必须要做好定期的备份工作,如我们可以 ...