键盘敲烂,月薪过万作业不做,等于没学
当前系列: ASP.NET 修改讲义

在razor中,除了简单的“融合”HTML和Model数据,还可以进行更复杂的逻辑

语句块

@后直接跟花括号({}),花括号里面可按C#语法书写单行/多行语句。
@{
    int age = 23;
    string name = "子祥";
    //string greet = $"{name}今年{age}岁了,来源栈学习真是棒棒哒";
}
一个page里面可以有多个代码块。

语句块之间可以互相引用:

@{
    int age = 23;
    string name = "子祥";
}
<p>源栈欢迎你!</p>
@{
    string greet = $"{name}今年{age}岁了,来源栈学习真是棒棒哒";
}

语句块中不建议声明方法、类、属性等声明不会报错,但会将其自动变为functions块

functions块

用于更复杂的方法、属性、类等的声明

@functions{
    void greet(string name)
    {
        //return $"源栈欢迎您!{name}";
    }
    int Age { get { return 18; /*functions和code block之间,无法相互引用*/ } }
}

和语句块一样,functions块之间可以互相引用。

说明:不要把@{}当成C#中的作用域符号,它只是区分HTML代码和C#代码的!

演示:在代码块中再括起来一个变量……

表达式

在@{}和@functions{}中声明的变量、属性或有返回值的方法,可以在html标签中呈现出来。

显式(explicit)

@后接花括号(()),花括号中可以是:

  • 变量/属性/有返回的方法
    <p>@(name)</p>
    <p>@(Age)</p>
    <p>@(greet("阿泰"))</p>
  • 计算表达式
    <p>@($"{name}今年{age}岁了,来源栈学习真是棒棒哒")</p>

总结起来,@()输出圆括号中的运算结果。

注意:表达式后面不要跟分号(;),代码块里必须要有分号(;)

隐式(implicit)

在不影响编译的时候,也可以省略圆括号,比如:

<p>@Age</p>
<p>@greet("阿泰")</p>

其关键是:没有圆括号,@后面不能跟:

  • 非变量/属性/方法名的其他符号,比如 $""、++等
    <p>@++age</p>
    <p>@$"{name}今年{age}岁了,来源栈学习真是棒棒哒"</p>
  • 使用泛型(<>和html标签冲突)
  • 不能进行运算,比如:
    <p>@name+"源栈"</p>
    生成的会是:子祥 + 源栈,是:子祥源栈

另外,如果想要呈现出@符号的话,使用@@:

@@阿泰

背后原理

实际上,.cshtml文件会被编译成为class。 

在razor的代码块中制造一些错误,比如变量greet和方法greet()重名,然后查看报错页面

显示完整的编译源:

行 31:       public class _Page_Views_Home_Index_cshtml : System.Web.Mvc.WebViewPage<_17bang.Models.Student> {
行 35:           #line 9 "C:\Users\86186\source\repos\17bang\17bang\Views\Home\Index.cshtml"          
行 37:       string greet(string name)
行 38:       {
行 39:           return $"源栈欢迎您!{name}";
行 40:       }

行 56:           public override void Execute() {

行 60:       int age = 23;
行 61:       string name = "子祥";
行 62:       string greet = $"{name}今年{age}岁了,来源栈学习真是棒棒哒";

行 75:   WriteLiteral("\r\n<h1>\r\n");

行 89:   Write(greet);

#理解#:

  • 一个.cshtml文件会被编译成一个类
  • functions块被编译成类中的方法
  • 语句块被放到方法Execute()中
  • HTML和表达式的内容都在方法Execute()中逐行输出……

PS:ASP.NET core项目中可查看完整源代码


复杂呈现

我们还可以控制Html内容的呈现

注释

比较两种注释:

@*<p>Razor注释:飞哥帅得一逼</p>*@
<!--
    <p>HTML注释:飞哥帅得一逼</p>
-->
  • @**@:服务器端注释,编译时被省略,不会出现在客户端
  • <!-- -->:HTML客户端注释,会直接发送到客户端,只是因为HTML语法,浏览器不予显示而已

再次理解:客户端/服务器端

注意:@**@注释不能嵌套

分支

@if...else...

@if (DateTime.Now.Ticks % 2 == 0)
{
    string trainer = "源栈";
    <p>被2整除</p>
    @trainer
}
else   /*前面不要再加@符号*/
{
    <p>不能被2整除</p>
    if (true)
    {

    }
    @name  /*name变量在之前代码块声明*/
}

@switch

@{
    DayOfWeek day = DayOfWeek.Monday;
}
@switch (day)
{
    case DayOfWeek.Sunday:
        <p>星期天</p>
        break;
    case DayOfWeek.Monday:
        <p>星期一</p>
        break;
        //...
    default:
        break;
}

@和;的写与不写?

  • 表达式始终要用@引导,且不加;
  • 被@{}直接包裹着的语句要加;

注意星期天前后一定要有html标签包裹(演示),如果你确实一个标签也不想要,可以使用text标签包裹:

<text>星期天</text>


循环

@for

@for (int i = 0; i < 10; i++)
    {
        <p>@i</p>
    }

@foreach

@while和@do...while

其他

@using

@try...catch...finally

@try
{
    int i = 0; 
    while (i < 10)
    {
        <p>@(i++)</p>
        i++;
    }
}
catch (Exception)
{

    throw;
}


作业

  1. 利用循环,做出分页效果(链接可暂时简化为:/Article?pageIndex=1,总页数为5),根据当前页(Request获取pageIndex)确定“上一页和“下一页”链接的显示与否
  2. 利用循环分支,实现如下图所示的页面效果:

    简便方式:使用CSS定位而不使用空格
  3. 参考一起帮·任务历史月表新建 /Task/History/Month 页面,利用表格,输出按月按周组织的任意一个月份的日历。  


学习笔记
源栈学历
今天学习不努力,明天努力找工作

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 ASP.NET 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码