一、ASP.Net MVC简介
1,什么是ASP.NET MVC?
HttpHandler是ASP.net的底层机制,如果直接使用HttpHandler进行开发难度比较大、工作量大。因此提供了ASP.Net MVC、
ASP.Net WebForm等高级封装的框架,简化开发,他们的底层仍然是HttpHandler、HttpRequest等
例如:ASP.NET MVC的核心类仍然是实现了IHttpHandler接口的MVCHandler
2,ASP.NET WebForm和ASP.NET MVC的关系?
两者都是对HttpHandler的封装框架,ASP.NET MVC的思想,更适合现代项目的开发,因此会逐步取代WebForm
3,为什么ASP.NET MVC更好
程序员有更强的掌控力,不会产生垃圾代码;程序员能够更清晰的控制运行过程,因此更安全、性能和架构等更清晰。
入门“难”,深入“相对比较简单”
4,什么是MVC模式
模型(Model)、视图(View)、控制器(Controller)
Model负责在View和控制器之间进行数据的传递(用户输入的内容封装成Model对象,发送给Controller);
要显示的数据由Controller放到Model中,然后扔给View去显示。
Controller不直接和View交互
5,ASP.Net MVC与“三层架构”没有任何关系。
唯一的“关系”:三层中的UI层可以用ASP.Net MVC来实现
6,“约定大于配置”:
二、ASP.Net MVC起步
1,项目的创建
新建项目——C#——Web——ASP.NET Web应用程序(不要勾选“将Application Insights添加到项目”)——确定;
选中“Empty”——勾选MVC(不要勾选Host in the cloud)——确定
2,控制器的建立和视图的建立
在Controller文件夹下右键——添加——控制器——选择“MVC5控制器-空”,
注意:类的名字以Controller结尾,会自动在View文件夹下创建一个对应名字的文件夹(没有就手动创建文件夹)
在View/文件夹名字 下创建视图Index(和XXXController的Index方法一致)
注意:添加视图时,模板选择Empty,不要勾选创建为分部视图和使用布局页
3,新建一个用来收集用户参数的类
IndexReqModel(类名无所谓,可以随便起)包含Num1、Num2两个属性(只要不重名,大小写都可以)
然后声明一个IndexRespModel类用来给view传递数据显示,有Num1、Num2、Result。
也可以同一个类实现,但是这样写看起来比较清晰
代码:
public class TestControler:Controller { public ActionResult Index(IndexReqModel model) { IndexReqModel resq = new IndexReqModel(); resq.num1 = model.Num1; resq.num2 = model.Num2; resq.result = model.Num1 + model.Num2; return View(resq); } }
4,Index.cshtml的代码
@model Test1.Models.IndexReqModel DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Indextitle> head> <body> <div> <input type="text" value="@Model.Num1" />+<input type="text" value="@Model.Num2" />[email protected] div> body> html>
5,在浏览器访问:http://localhost:56919/Test/Index?num1=1&num2=2
6,执行过程、数据流动分析:
当用户访问“Test/Index?num1=1&num2=2”的时候,会找到Controller下的TestController的Index方法去执行,
把请求参数按照名字填充到Index方法的参数对象中(MVC引擎负责创建对象,给数据赋值,并且进行类型的转换),
return View(resq)就会找到Views下的和自己的“类名、方法名”相对应的Index.cshtml,然后把数据resp给到Index.cshtml去显示。
注意:
1,@model Test1.Models.IndexReqModel //这里的model要小写开头,表示传递过来的数据是IndexReqModel类型的
2,@Model指传递过来的对象 //这里的Model要大写开头
3,cshtml模板就是简化HTML的拼接的模板,最终还是生成html给浏览器显示,不能直接访问cshtml文件
三、Razor语法
1,语法简单:
@启动的区域为标准的C#代码,其他部分是普通的html代码
2,用法:
@{string a = "abc";} @a @{C#代码块} //有标签的就是html代码
@Model //控制器传递来的对象
@Model.dog.Name //控制器传递来的dog对象的Name属性的值
@if(),@foreach()等C#语句
3,在代码中输入大段文字
两种方法:
1,@:大段文字 //不推荐使用了,
代码:
if(Model.IsOK) { @:文字 }
2,文字
代码:
if(Model.IsOK) { 文字 }
razor会智能识别哪块是C#,哪块是HTML,HTML中想运行C#代码就用@,想在C#中代码中输入HTML就写“HTML标签”。
但是如果由于样式等原因不想加上额外的标签,那么可以用
4,注意:不要在@item后写分号 //分号会被当成html代码,原样输出
5,razor会自动识别哪块是普通字符,哪块是表达式,主要就是根据特殊符号来分辨(“识别到这里是否能被当成一个合法的C#语句”)。
例子:
不能这样写 ,否则ashx会被识别为CourseId的一个属性,
应该加上()强制让引擎把CourseId识别成一个单独的语法,
技巧:
不确定的地方就加上(),也可以按照编辑器的代码着色来进行分辨
6,如果不能自动提示,把页面关掉再打开就可以了。如果还是不能自动提示,只要运行没问题就行。
cshtml文件中如果有警告甚至错误,只要运行没问题就没关系
7,[email protected],razor会自动识别出来是邮箱,所以razor不会把 @qq.com当成qq对象的com属性。
但是对于特殊的邮箱或者就是要显示@,那么可以使用@转义@,也就是“@@”
8,易错:
要区分C#代码和html代码,
正确的:style='display:(@message.IsHide?"none":"block")'
错误的:style="display: (@message.IsHide) ? none : block"
注意:
为了避免C#中的字符串的“”和html的属性值的“”冲突,建议如果html属性中嵌入了C#代码,那么html的属性的值用单引号
9,为了避免XSS攻击(跨站脚本攻击,在输出对象中嵌入script代码等恶意代码),Razor的@会自动把内容进行htmlencode输出,
如果不想编码后输出,使用@Html.Raw()方法
10,Razor的注释方法
@*要注释的内容*@
11,Razor中调用泛型方法的时候,由于<>会被认为是html转回标记模式,因此要用()括起来,比如@(Html.Test
()可以解决大部分问题,在View中一般不会调用复杂的方法
12,如果cshtml中任何html标签的属性中以"~/"开头,则会自动进行虚拟路径的处理,
当然一般是给