如鹏网学习笔记(十五)ASP.NET MVC核心基础笔记

一、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标签”。
    但是如果由于样式等原因不想加上额外的标签,那么可以用标记,特殊的不会输出到Html中。

  4,注意:不要在@item后写分号 //分号会被当成html代码,原样输出

  5,razor会自动识别哪块是普通字符,哪块是表达式,主要就是根据特殊符号来分辨(“识别到这里是否能被当成一个合法的C#语句”)。

    例子:
      不能这样写 ,否则ashx会被识别为CourseId的一个属性,
      应该加上()强制让引擎把CourseId识别成一个单独的语法,

    技巧:

      不确定的地方就加上(),也可以按照编辑器的代码着色来进行分辨

  6,如果不能自动提示,把页面关掉再打开就可以了。如果还是不能自动提示,只要运行没问题就行。
    cshtml文件中如果有警告甚至错误,只要运行没问题就没关系

  7,
[email protected],razor会自动识别出来是邮箱,所以razor不会把 @qq.com当成qq对象的com属性。
    但是对于特殊的邮箱或者就是要显示@,那么可以使用@转义@,也就是“@@”

      
  • [email protected]//会把@item.Length识别成邮箱,       因此用上()成为:       
  • item_@(item.Length)
  •   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标签的属性中以"~/"开头,则会自动进行虚拟路径的处理,
        当然一般是给

    你可能感兴趣的:(如鹏网学习笔记(十五)ASP.NET MVC核心基础笔记)