mvc概述

Razor视力引擎(@{}((html中写)大括号中写C#代码)) EF(Entity Framework)框架

MVC概述

约定优于配置

ASP.NET MVC 是基于ASP.NET的一款B/S架构应用程序设计的开发框架

C((Controller)控制器:用来处理用户的请求(当用户请求一个url地址时会对url地址进行路由解析,对请求进行处理,(中转,控制,将业务逻辑交给Model))(选择一个视图))(提供视图和模型之间的协调程序。控制器负责处理输入,对模型进行操作,并决定执行哪一个动作,如渲染一个视图,或是重定向另一个页面,三者的关联)(响应用户输入,处理来自用户、应用程序业务逻辑的通信)

M((Model):(业务逻辑处理)(领域模型,描述了某项业务的处理))(封闭用户数据及业务操作逻辑的类,描述了要处理的数据及操作数据的业务规则)(领域模型(具有业务的模型、视图模型(View Model专注于用户界面上显示的模型)))

V(View):((最终给用户看的(就是一个动态的模板)(渲染html)))(定义了用户界面的显示方式,是动态生成HTML页面的模版)(模型的可视化表示,是框架渲染给浏览器的结果标记)

MVC优点:不再维护视图状态;关注分离;有利于单元测试(更加符合http协议;把各个部分都分开,更加独立)(1 与协议更接近,MVC将一个请求映射成一个方法的调用(路由),不再有复杂的页面的生命周期,(Web Form事件驱动,试图隐藏HTTP无状态的本质(页面生命周期复杂)) 2 关注分离,将用户界面(视图)与驱动界面的代码(控制器)保持分离,对控制器的修改不一定也要修改用户界面将原来Web Form页面内容和C#代码耦合在一起的情况彻底改变,实现了页面内容和业务处理的彻底分离,将原来的.aspx.cs中的代码搬到了控制器中 3 可测试性,控制器作为一个单独的类,可以独立测试)

控制器接受用户输入,构造适当的模型,然后将其传递给视图。控制器和视图对模型都有依赖性,但模型本身对控制器和视图是一无所知的

设计模式:GOF23

三层架构,MVC

框架:半成品(ASP.NET MVC)

着重在表示层

 

MVC工作环境

Controllers目录(所有的控制器)(每个方法叫做动作(Action))

(Icontroller接口(Execute(RequestContext)方法))

(Models(数据注解))

Views(.cshtml(Shared(公共模板))(_ViewStart.cshtml))

命名规则 Controller包含两部分(前面是路由信息(Controller名称) 后面加上Controller(一个Controller对应一个文件夹 同名默认直接找到(也可以指定视图)))

Scripts(JS文件夹)()

Content目录(CSS和图片)

App_Start MVC运行的各种配置(RouteConfig(路由设置)(FilterCinfig(过滤器)))

Global.asax(全局应用程序类)(Application_Start())

约定与配置

原则:约定优于配置

Controllers、Models、Views目录分别保存控制器类、模型类与视图文件

每一个Controller类均以Controller结束

每一个控制器的视图均保存在单独的控制器名称目录下

模型绑定

控制器的操作(Action):控制器中的任何公共函数都公开为控制器操作。控制器方法不允许声明为表态(static)方法

控制器的默认方法:Index()

访问控制器指定的方法:

/xController访问Index方法

/xController/List访问List方法

比Controllers开始写

添加视图

Layout = null;不使用布局页

ViewBag(视图包)(动态视图数据字典)

可以用/传递参数

控制器基类方法

EmptyResult代表无结果

.View 返回 ViewResult((返回html代码)代表html和标记)(ActionResult)

.Redirect(创建一个重定向到指定的URL的System.Web.Mvc.RedirectResult对象) 返回 RedirectResult(代表重新定向到新的url)

.RedirectToAction(使用操作名称重定向到指定的操作) 返回 RedirectToRouteResult(代表重定向到新的控制器操作)

.RedirectToRoute(使用路由名称重定向到指定的路由) 返回RedirectToRouteResult(代表重定向到新的控制器操作)

.Json(创建JsonResult对象,该对象使用指定JSON请求行为将指定对象序列化为JavaScript对象表示法(JSON)格式) 返回JsonResult(代表可以在AJAX应用程序中使用的JavaScript Object Notation结果)

.Content 返回ContentResult(代表文本结果)

ActionResult是抽象类,实际返回的是由其派生类,可自由定义返回值的类型

View方法 如果没有参数,调用的是和动作同名的视图;如果有参数,按参数获取视图 return View(“~/Views/Home/Index.cshtml”)

Controller中为视图传递数据,可以用ViewBag(dynamic)(是对ViewData的封闭,支持强类型)和ViewData(放入的都变成了object类型)(ViewDataDictionary)(不支持强类型,需要强制类型转换)(名字中间可以有空格)

@**@(Razor的注释)

public ContentResult Content()

{

    return Content("我是Content,我返回纯文本字符串");

}

public RedirectResult Redirect()

{

    TempData["Name"] = "张张";//可用于临时在页面中传递数据,但是数据一旦读取一次后不能再读,可以在重定向中传递数据,不能使用ViewBag在重定向中传递数据

    return Redirect("/Home/Index");

}

JsonRequestBehavior.AllowGet(允许GET请求,Json默认接收POST请求,不支持GET请求,不设置就不允许)

FileResult returnFile(使用文件名和内容类型创建一个FilePathResult对象)

Mime类型:(application/pdf)(向客户端发送pdf文件)

1 当我们在浏览器中敲入一个url地址,回车后就向服务器发送一个请求,这个请求的url地址就会被MVC框架进行路由解析,会解析出你要访问哪一个Controller,访问它下面的哪一个Action以及参数信息,MVC框架会创建响应的Controller的实例,调用指定的Action方法,这时控制器可能需要进行业务处理,介是他不做实际的业务处理工作,他会交给Model或者(BLL)去做,最终他需要指定一个输出给用户响应;

2 响应可以有很多各,可以是html标记结果、文件、字符串、Json数据、重定向,如果想返回html标记需要使用return View(),返回的是与Action同名的视图;

3 ViewResult包含返回给用户的html标记,所以包含View的Action,需要创建响应的视图,return View(),返回的是与Action同名的视图,return View(“视图名称”),返回的是同一控制器下的视图,return(“/Views/控制器名称/视图名称.cshtml”),返回的是不同控制器下的视图,如果想向视图中传入数据,可以使用ViewBag、ViewData、TempData、对象(强类型的)(可以是Model类的实例,也可以是其他的类库中的类型)

(视图中的)@Model (dynamic WebViewPage<dynamic>.Model)

@model 命名空间名.Models.Student(用来引入强类型)

视图

ViewDataKey/Value字典集合;ASP.NET MVC1就有了;基于ASP.NET Framework 3.5;ViewData比ViewBag快;需要转换合适的类型;有一些类型转换代码

ViewData.Model = (一个Model);(设置页面的强类型数据)

ViewBagdynamic类型对象;ASP.NET MVC3才有;基于ASP.NET Framework 4.0;ViewBag比ViewData慢;不需要类型转换;可读性更好

约定:默认视图名称与控制器中的方法名称相同

[HttpPost]:表示一个特性,该特性用于限制操作方法,以便该方法只能处理POST请求

在地址栏中直接输入(控制器/Action名称)是GET访问方式

当Action没有特性修饰时,默认以GET方式访问,加上[HttpPost]这个特性,限制该Action只通过Post方式访问(提交表单)

模型绑定(自动装配):需要我们定义一个和表单对应的视图模型,方法的参数定义为该模型类的实例(form表单元素name中的值需要和模型的属性名称一致)

(form表单提交按name属性)

Razor视图引擎

作用:解释、执行视图中的代码

是默认视图引擎(MVC4可选)

@Model.Name

@(Model.Name)

@Html.Raw(Model.Message)(Html.Raw(返回不是HTML编码的标记)(后面不能写分号))

@{string y = ”name”;}(代码块中不能用混合编码)

@foreach (var item in items){

    Item:@i.Name

}

@(Html.aMethod<aType>())

转义符:@@(电子邮箱通常不需转义即可正确识别)

代码块内部单行注释:// 多行注释:@**@

Razor引擎自动对变量中html代码进行html编码,可以防止JS的跨站攻击(防止脚本注入攻击)

@(变量名).html内容(小括号必须有)(@变量.info,Razor引擎认为info和变量是有关系的,这时需要使用())

/Views/_ViewStart.cshtml文件(在整个网站上应用布局)

@RenderBody()(布局页)

布局页中(@RenderSection(“Stu”)(在布局页中,将呈现指定部分的内容并指定该部分是否为必需)(就是一个占位符,需要视图中提供指定名称的@section,如果不提供的话,会报错,避免报错))

子页中(@Section Stu(和上面的一致) 分区段)

默认布局:_Layout.cshtml

@model在当前页面中指定 该页面指定的强类型信息 每个页面只有一个

@Html.Partial(“分部视图名称(没有扩展名)”)

    @{@Html.RenderPartial(“分部视图名称”);()

}

在主视图中传递的参数传递给了@Model

RenderPartial(没有返回值)

在控制器下用的分布视图可以用在对应视图文件夹下

ChildActionOnly 表示一个特性,该特性用于指示操作方法只应作为子操作进行调用

@Html.Action 调用指定子操作方法并以HTML字符串形式返回结果

MVC模型

可保存并操作应用程序数据

基架:可以为应用程序快速的创建增、删、改、查等功能

ORM:(对象关系映射(Object Relational Mapping))用于实现面向对象编程语言里不同类型系统的数据之间的转换的一种程序技术

包括以下四部分:

一个对持久类对象进行CRUD操作的API

一个语言或API用来规定与类和类属性相关的查询

一个规定MAPPING METADATA的工具

一种技术可以让ORM的实现同事务对象一起进行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的优化操作。

EF:(Entity Framework) 是微软的一个ORM框架(是微软主推的数据存取技术,在实际开发中(ASP.NET MVC等)被用来构建应用程序的数据访问层)(用XML)

NHibernate

继承自DbContext(数据库访问上下文)

一个DbSet<>对应一张表

Find()方法

添加: 1 创建一个模型 2 创建一个上下文 3 添加一个实例 4 将实体添加到实体集合中去 5 将实体的变化映射到数据库中去

修改: 3 构造一个要修改的实体 4 将实体添加到实体集合中,告诉上下文管理该实体对象 Attach方法 5 告诉上下文该实体状态已经更改 System.Data. SaveChanges

删除: 3 在实体集合中找到要删除的实体 Find() 4 告诉上下文将删除的实体Remove() SaveChanges()

遍历表的全部数据

代码优先(Code First): 1 先构造实体模型(需要重新生成(必需)); 2 使用Entity Framework创建控制器; 3

IEnumerable(迭代接口)

ModelState.IsValid(模型绑定是否成功(true为成功))

?(可空的数据类型)

Return new HttpStatusCodeResult(HttpStatusCode.BadRequest);返回错误码

Return HttpNotFound();返回没找到

EF框架

Migration(迁移)

NuGet程序包管理器 > 程序包管理器控制台(1. Enalbe-Migrations; 2. Configuration.cs 中的AutomaticMigrationsEnabled = true; 3. 执行Update-Database;)

.edmx

导航属性

查询语法

////查询语法

//var list = from c in db.T_Class select c;

 

////多条件

var list = from c in db.T_Class where c.ClassName.Contains("w") && c.ClassId.Trim().Length > 2 select c;

 

////方法语法

//var list = db.T_Class.Select(c => c);

 

return View(list);

DbContext db = new StuDBEntities();//使用了多态

 

分页 list.OrderbyDescending(b => b.id).Skip(跳过)(3).Take(3);

Dynamic(此类型的对象跳过静态类型检查)本质上是静态类型,叫动态类型(可用于类型的字段,方法参数,方法返回值,可用于泛型的类型参数)(可以赋值给或赋值任何类型并且不需电焊工的强制类型转换,因为这些是运行时执行的)(特点:运行时尝试调用)

匿名类

可空类型 值类型的局部变量(int? S = null;)

??用在可空类型上(后面为默认值)(运算符定义在将可以为null的类型分配给非可以null的类型时返回的默认值)

留言板 .net就业需求

Validation 验证

表单提交用name属性

在重定向中只能使用TempData传递数据,无法使用ViewData和ViewBag进行重定向数据的传递

Web下的启用编辑并继续

Axure RP原型设计软件

需求列表

扩展方法:要定义在静态类内 尽量与被扩展的类放在同一命名空间下 第一个参数是被扩展的类型(不算参数) 扩展类型前要加this关键字

db.Entry()

Sql Server Profiler 跟踪

返回值类型是Iqueryable类型的都会延迟加载Ienumerable不会延迟加载

ToList()可以禁用延迟加载

Include()可以禁用导航属性的延迟加载

<input type=”radio” />同(name)为一组

@using(Html.BeginForm())

@using(Html.BeginForm(“action”, “controller”))

@using(Html.BeginForm(“action”, “controller”, FormMethod.Get))

@using(Html.BeginForm(“create”, “test”, FormMethod.Get, new{ target = “_blank” }))

@{ Html.BeginForm(); }

@{ Html.EndForm(); }

Html.AntiForgeryToken()生成隐藏的验证字段

SelectListItem 下拉列表的数据类型

@Html.TextBoxFor(u => u.Name) 用强类型传值 可以直接绑定数据(不包含密码框中的内容-)

@using(Html.BeginForm()){ }

数据绑定优先级:最高(@Html.TextBox(“Name”, “李四”)); 第二(ViewBag中找Name);第三(ViewData.Model是查找Name)

@Html.TextBox(“SName”)无法使用Model的强类型

找到。。。在。。。时候做。。。

jquery.unobtrusive-ajax

new AjaxOptions{ UpdataTargetId = “id”, insertionMode = insertionMode.(InsertAfter,InsertBefore,Replace,ReplaceWith) }

LoadingElementId = “Id”, LoadingElementDuration = 2000, OnBegin = “begin();”, Confirm = “确认?”

MVC的验证:

    浏览器端验证:增加客户体验

    服务器端难:保证数据安全

System.ComponentModel.DataAnnotations;

System.Web.Mvc;

StringLength设置输入字符串允许的最大长度(也可以是区间)

RegularExpression正则

Range (int double) 的范围

Compare 比较

Remote设置服务器端远程数据验证

ErrorMessage = “”自定义错误提示消息

 

Display Name显示名称 Order排序

ScaffoldColumn设置模型属性是否使用基架模板(ScaffoldColumn(false)不想输出)

HiddenInput设置隐藏元素[HiddenInput(DisplayValue = false)]

DataType指定模型属性的关联类型

System.Text.RegularExpressions

空的双引号的表示模型级错误

[ValidateAntiforgeryToken

[StringLength(20, ErrorMessage = “{0}不能少于{2},不能多于{1}”)]第一个点位符取的是属性名称,{1}是最大值,{2}是最小值

[MetatataType(typeof(MessageValidatorInfo)(指定要与数据模型关联的元数据类))](伙伴类:共享元数据信息)

AOP(Aspect-Oriented Programming)面向切面编程

Filter过滤器

将那些与业务核心不大相关的杂七杂八的东西独立开,每次实现了业务核心之前或之后,调用一下对应的方法(验证登陆、权限、性能检测、错误信息记录等)

新建Filters文件夹,添加类AuthorizationAttribute,引入System.Web.Mvc,继承AuthorizeAttribute

FilterAttribute(所有筛选器特性的基类)IauthorizationFilter(OnAuthorization(方法名))

请求信息封装在filterContext中(filterContext.HttpContext.Session[“”])

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { })

[MyAuthorization(自定义的过滤器)]

继承自HandlerErrorAttribute(生成的代码不能删 否则不能捕获异常)

filterContext.Result = new RedirectResult(“/Error/error.html”)

<system.web>

<customErrors mode=”On”></customErrors>

</system.web>

ActionFilterAttribute(OnActionExecuting()方法)

RouteTable(存储路由信息(存储静态信息))

RouteCollection(路由集合)(为ASP.NET路由操作提供路由的集合)

自定义路由要放在默认路由之前,后面不会再

项目 添加 区域

[MetadataType(typeof(Student))]

public partial class Student { }

[ScaffoldColumn(false)](隐藏字段,不显示)

ViewBag.ClassId = new SelectList(db.Class, “ClassId”, “Name”);

[Required(不为空验证)]

[DisplayFormat(ApplyFormatInEditMode = true, DataForatString = “{0:yyyy-MM-dd}”)]

 

 

Student student = db.Student.Find(id);//通过id去找对象

OCP原则(开闭原则):在设计一个软件系统模块(类、方法)的时候,应该可以在不修改原有的模块(修改 关闭)的基础上,能扩展其功能(扩展开放(接口))

稳定性:

扩展性:

using Microsoft.Practices.Unity;

Int64

接口设计的要尽可能的小

能为应用程序的属性、类、方法等 (元数据) 打上特定的标签

特性就是一段自描述的信息 可以为类等打上一个特性

AuthorizeAttribute(验证是否授权)

ActionFilterAttribute(视图和Action的过滤)

Attribute.GetGustomAttribute()(获取指定特性)

Attribute.GetGustomAttributes(获取所有特性(是一个数组))

区域名称

HttpContext.Current.Session[“”](session)

System_Grid

System_Module

System_Action功能菜单

pagination 是否显示分页

rownumber行数

 

 

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

作者:黯淡の青春    博客地址:http://www.cnblogs.com/wuwangqianxun/

本人也是初学者,入门不久,大家相互切磋,就当娱乐
原文地址:https://www.cnblogs.com/wuwangqianxun/p/7205323.html