欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ASP.NET(10)--第一个ASP.net MVC 项目和Razor语法

程序员文章站 2022-04-02 18:12:48
...

一、第一个ASP.net MVC 项目

  1. 项目的创建:讲课使用VS2015,用VS2013也可以,新建项目→Visual C#→Web→【ASP.Net Web应用程序】 ,不要勾选【将Application Insights添加到项目】,然后【确定】。在下一步的界面中选中“Empty”(初学者不要用MVC的模板项目,会太乱),勾选【MVC】,不要勾选【Host in the cloud】。一定注意:上面图标选“empty”,不要选“MVC”;下面勾选MVC,否则会生成很多没用的代码。
    ASP.NET(10)--第一个ASP.net MVC 项目和Razor语法
  2. 控制器的建立、视图的建立 :在Controllers文件夹下点右键→【添加】→【控制器】→选择【MVC5控制器-空】,类的名字以Controller结尾,比如“TestController”,会自动在Views文件夹下创建一个Test文件夹(如果不新建就手动建,这个文件夹的名字必须是TestController去掉Controller),在Views/Test下新建视图Index(和TestController的Index方法一致):添加→视图
    ASP.NET(10)--第一个ASP.net MVC 项目和Razor语法
    ASP.NET(10)--第一个ASP.net MVC 项目和Razor语法
  3. 新建一个用来收集用户参数的类:IndexReqModel(类名无所谓)包含Num1、Num2两个属性(只要不重名,大小写都可以)。然后声明一个IndexRespModel类用来给view传递数据显示,有Num1、Num2、Result。也可以同一个类实现,但是这样写看起来比较清晰。
    ASP.NET(10)--第一个ASP.net MVC 项目和Razor语法
  4. 在Index.cshtml如下编写
    ASP.NET(10)--第一个ASP.net MVC 项目和Razor语法
  5. 调试启动后,浏览器访问:http://localhost:57005/Test/Index
    画图分析执行过程、数据流动过程:当用户访问“/Test/Index?num1=1&num2=5”的时候,会找到Controllers下的TestController的Index方法去执行,把请求参数按照名字填充到Index方法的参数对象中(MVC引擎负责创建对象,给数据复制,并且进行类型的转换),reutrn View(resp)就会找到Views下的和自己的“类名、方法名”相对应的Index.cshtml,然后把数据resp给到Index.cshtml去显示。@model (要小写) WebApplication2.Models.IndexRespModel表示传递过来的数据是IndexRespModel类型的,@Model(大写开头)指向传递过来的对象。
    cshtml模板就是简化HTML的拼接的模板,最终还是生成html给浏览器显示,不能直接访问cshtml文件。

二、Razor语法:

  1. Razor语法非常简单,@启动的区域为标准的C#代码,其他部分是普通的html代码。
  2. 用法:
    • @{string a=“abc”;}@a @{C#代码块}。有标签就是html代码
    • @Model
    • @Model.dog.Name
    • @if(),@foreach()等C#语句
  3. 下面的代码是不行的,因为纯文字被视为C#代码:
   if(Model.IsOK)
   {
   启用
   }

要使用“@:”前缀(不推荐),如下:

   if(Model.IsOK)
    {
    @:启用
    }

如果要在代码区块中输出大量文字,只要在代码前后加上Html标签即可

   if(Model.IsOK)
    {
    <span>启用</span>
    }

razor会智能识别哪块是C#,哪块是HTML,HTML中想运行C#代码就用@,想在C#中代码中输入HTML就写“HTML标签”。
但是如果由于样式等原因不详加上额外的标签,那么可以用标记,特殊的不会输出到Html中。
4. 不要习惯性在@item后写分号
5. Razor理解HTML标记语言的结构,当<li>标签关闭的时候他也可以自动转回代码@foreach(var item in strs)
{<li>yes @item</li>}
6. Razor语法 :razor会自动识别哪块是普通字符,哪块是表达式,主要就是根据特殊符号来分辨(“识别到这里是否能被当成一个合法的C#语句”)。不能这样写<a href="aaa@qq.com">否则razor会认为ashx是CourseId的一个属性,应该加上()强制让引擎把CourseId识别成一个单独的语法<a href="Course(@CourseId).ashx">,不确定的地方就加个括号。通过VS中编辑器的代码着色也可以分辨出来。
7. 如果不能自动提示,把页面关掉再打开就行了。如果还不能自动提示,只要运行没问题就行。cshtml文件中如果有警告甚至错误,只要运行没问题就没关系。
8. <span>aaa@qq.com</span>,razor会自动识别出来是邮箱,所以razor不会把 @qq.com当成qq对象的com属性。但是对于特殊的邮箱或者就是要显示@,那么可以使用@转义@,也就是“@@”
9. <li>aaa@qq.com</span>会把@item.Length识别成邮箱,因此用上()成为:<li>aaa@qq.com(item.Length)</span>
10. 易错,要区分C#代码和html代码,下面是对的:style=‘display: @(message.IsHide ? “none” : “block”)’ 下面是错误的: style=“display: (@message.IsHide) ? none : block” 为了避免C#中的字符串的"“和html的属性值的”“冲突,建议如果html属性中嵌入了C#代码,那么html的属性的值用单引号。
11. Razor的@会自动把内容进行htmlencode输出,避免了XSS攻击,如果不想编码输出,那么用@Html.Raw()
12. razor注释使用@注释内容@,不过谁会在cshtml中写注释???
13. (*)razor中调用泛型方法的时候,由于<>会被认为是html转回标记模式,因此要用圆括号括起来,比如@(Html.Test<String>),()永远是很强大的。不过View中一般不会调用复杂的方法。
14. 如果cshtml中任何html标签的属性中以”~/"开头,则会自动进行虚拟路径的处理,当然一般是给<script>的src属性、<link>的href属性、<a>标签的href属性、<img>的src属性用的。
15. html标签的任何属性的值如果是C#的值,那么如果是bool类型的值,那么如果值是false,则不会渲染这个属性,如果值是true,则会渲染成“属性名=属性名”,比如:@{bool b1 = true; bool b2 = false;}
<aaa aa="/1.html" checked="@b1" ac="@b2">aaa</aaa>
16. 这个特性是为<input type="radio/checkbox">的checked属性和<select><option>的selected属性使用的,这样避免了进行三元运算符判断。
17. cshtml是编译生成一个动态的程序集;在cshtml中写@this.GetType().Assembly.Location可以拿到编译生成的程序集的dll文件的路径,反编译可以看到cshtml最终生成一个类,类中就是在拼接html;类是继承自 WebViewPage,后续用的@Model、@Html等都是WebViewPage类的成员。
18. 尽可能维持View的简单,不要在View中写业务逻辑以及过去复杂的代码

总结:

  • @就是C#,<aaa></aaa>就是html
  • 如果想让被识别成html的当成C#那就用@()
  • 如果想让被识别成C#的当成html,用<span>等标签,如果不想生成额外的标签,就用<text></text>
  • 如果不想对内容htmlencode显示就用@Html.Raw
  • 属性的值如果以"~/"开头会进行虚拟路径处理
  • 属性值如果是bool类型,如果是false就不输出这个属性,如果true就输出“属性名=属性名”<input type="checkbox" checked="@b1"/>

知识点补充

dynamic是C#中提供的一个语法,可以实现像JavaScript一样的动态语言,可以到运行的时候再去发现属性的值或者调用方法。
dynamic p = new Person();
p.Name = “InLett.com”;
p.Hello();
这样即使没有成员:p.Age=3;编译也不报错,只有运行的时候才报错。
dynamic的好处是灵活,坏处是不容易在开发时候发现错误、而且性能低(反射看看)。
如果dynamic指向System.Dynamic.ExpandoObject()对象,这样可以给对象动态赋值属性(不能指向方法):

dynamic p = new System.Dynamic.ExpandoObject();
p.Name = "InLett.com";
p.Age = 10;
Console.WriteLine(p.Name+","+p.Age);

var类型推断

var i=3;
var s="abc";

编译器会根据右边的类型推断出来var是什么类型,反编译一下。
var和dynamic的区别:var是在编译的时候确定,dynamic是运行的时候动态确定的;var变量不能指向其他类型的,dynamic可以。

匿名类型
匿名类型是C#中提供的一个新语法:var p = new{Age=15,Name=“InLett.com”};这是创建一个匿名类的对象,这个类没有名字。反编译看一下(IL模式下看)编译器生成了一个类,这个类是internal(IL中是private)、属性是只读的、初始值是通过构造函数传递。
因为匿名类型的属性是只读的,所以匿名类型的属性是无法赋值;因为匿名类型是internal,所以无法跨程序集访问其成员。

三、 Controller给View传递数据的方式

ViewData

以ViewData[“name”]=“ylt”;string s=(string)ViewData[“name”]这样键值对的方式进行数据传送。

ViewBag

ViewBag是dynamic类型的参数,是对ViewData一个动态类型封装,用起来更方便,和ViewData共同操作一个数据。ViewBag.name=""; @ViewBag.name。用ViewBag传递数据非常方便,但是因为ASP.Net MVC中的“Html辅助类”等对于ViewBag有一些特殊约定,一不小心就跳坑了(https://www.cnblogs.com/webapi/p/5669035.html),所以尽量不要用ViewBag,而是使用Model,虽然会麻烦“越麻烦工资越高”

Model

可以在Controller中通过return View(model)赋值,然后在cshtml中通过Model属性来访问这个对象;
如果在cshtml中通过“@model 类型”(注意model小写)指定类型,则cshtml中的Model就是指定的强类型的,这样的cshtml叫“强类型视图”;如果没有指定“@model 类型”, 则cshtml中的Model就是dynamic。

相关标签: MVC模式