前言

Full stack 的问题就是经常需要一阵子离开一个环境. 比如我跑去写 Angular 几个月. 回来写 Razor, 肯定是卡卡的.

尤其是一些比较不常用到的语法. 所以有一个很好的笔记就很重要了. 以前我都懒的写, 但这半年我整理了很多, 也体会到这样做确实是很方便.

毕竟人家写的是教程, 但是我只是要复习丫, 自然看自己的笔记是最舒服.

这里记入一些我常用到的

参考

Docs – Razor syntax reference for ASP.NET Core

当想写 @ 时

@ 是特殊字符, 用来切换 to C#, 所以下面会报错

解决方法就是写 double @@

<h1>value @@ value</h1>

最后只会输出 1 个

另外, email 的 @ 不需要 double, 它有特别处理了.

<a href="mailto:support@stooges.com.my">support@stooges.com.my</a>

题外话: C# 的 quote "

C# 的 quote 也是类似的方式破解.

var value1 = "class="abc""; // 语法错误
var value2 = "class=\"abc\""; // 用反斜杠破
var value3 = @"class=""abc"""; // 用 @ + double "" 破

更多详情请参考: C# – 11.0

当在 C# 作用域想输出 HTML text

<text>

用 <text> 标签可以切换回 HTML 作用域, 但 <text> 是 Razor 特别的 tag 最终不会 render, 类似 <ng-container>

<h1>@if (true)
{
<text>Hello World</text>
}
else
{
<text>Derrick</text>
}</h1>

上面这个只是作为一个例子, 更好的写法是

<h1>@(true ? "Hello World" : "Derrick")</h1>

@:

还有这种写法

<h1>@if (true)
{
@:my text
}
</h1>

Conditional Attribute

参考: Stack Overflow – ASP.NET MVC razor: conditional attribute in HTML [duplicate]

<div class="@null">Content</div>

当 class = null 那最终 class 完全不会出现。

注:如果是 empty string 会变成 <div class>,class 会出现,虽然不影响解析,但看上去怪怪的。所以最好使用 null。

但是如果 attribute 是 data-,那 null 和 empty string 是一样的。

参考: Stack Overflow – Razor conditional attribute not working

<div class="@null" data-message="@null">Content</div>
之后
<div data-message>Content</div>

拼接也容易

@{
var classValue = "c1 c2";
}
<div class="@(true ? $"{classValue} extra" : null)">Content</div>

for attribute data- 可以这样

<div @(true ? "data-whatever=SomeValue" : null)></div>
<div @(true ? $"data-whatever={"SomeValue"}" : null)></div>

第一个 =SomeValue 不需要 quote 挺神奇的呢。

另外 SomeValue 不可以有空格哦,有的话会 break 掉。。

所以推荐使用 raw(注:要 HTML encode 哦)

@{
var datas = new Dictionary<string, string> {
{ "key1", "<div>\"Hello World\"</div>" },
{ "key2", "value2" },
}; string appendDatas(Dictionary<string, string> datas) {
List<string> dataKeyValues = new List<string>();
foreach(var (key, value) in datas)
{
dataKeyValues.Add($"data-{key}=\"{WebUtility.HtmlEncode(value)}\"");
}
return string.Join(" ", dataKeyValues);
} <h1 @(Html.Raw(appendDatas(datas)))></h1>
}
<script>
const h1 = document.querySelector('h1');
const dataAttributes = Array.from(h1.attributes).filter(a => a.name.startsWith('data-'));
for (const { name, value } of dataAttributes) {
console.log([name, value]);
}
</script>

results

for style 的 example

参考: Stack Overflow – Conditional Formatting in a Razor Index View

拼接可以

@{
string? style = null;
}
<button style="color: white; @style">play</button>

@namespace

参考: Docs – @namespace

在 _ViewImports.cshtml 里面有一个 @namespace

@namespace Hello.World
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

之后所有的 view 都会依据 folder 给予 namespace

我踩过一个坑. 在一个 view 中想引入我的 Library Stooges

但我的 folder 结果里也有一个同名的 Stooges

于是就 error 了. 解决方法是避开这种撞名字的情况. 不建议去修改 @namespace 的逻辑.

当 for loop 拼接 <span> 时小心 new line 制造出来的 space

之前有提过 HTML 的特性 当 inline element 遇上 new line 会制造出 space

当我们写这样时

<p>
@{
var values = new List<string> { "abc", "xyz", "123" };
foreach (var value in values)
{
<span>@value</span>
}
}
</p>

出来的结果是

<p>
<span>abc</span>
<span>xyz</span>
<span>123</span>
</p>

它就会有空格, 像这样:

如果不希望有 new line 那么可以这样写

@{
var values = new List<string> { "abc", "xyz", "123" };
foreach (var value in values)
{<span>@value</span>}
}

或者 wrap 多一层 parenthese

foreach (var value in values)
{
{<span>@value</span>}
}

效果

注: 这些写法很可能会被 auto format 修正哦.

Disable Element Tag Helper

参考: Stack Overflow – The tag helper 'input' must not have C# in the element's attribute declaration area

有些 element 有默认的 Tag Helper, 比如 option

一旦有 Tag Helper, 那么就不可以使用 C# 语法, 会报错.

我们可以在 element 前面加叹号来 disable 这个 default 设置

<!option value="@customerAction.ToString()" @(true ? "selected" : "") >@customerAction.ToDisplay()</!option>

这样就可以使用 C# 语法了

ASP.NET Core – Razor Syntax的更多相关文章

  1. ASP.NET Core - Razor 页面简介

    简介 随着ASP.NET Core 2 即将来临,最热门的新事物是Razor页面.在之前的一篇文章中,我们简要介绍了ASP.NET Core Razor 页面. Razor页面是ASP.NET Cor ...

  2. ASP.NET Core - Razor页面之Handlers处理方法

    简介 在前一篇文章中,我们讨论了Razor页面.今天我们来谈谈处理方法(Handlers). 我们知道可以将代码和模型放在 .cshtml 文件里面或与 .cshtml 匹配的 .cshtml.cs ...

  3. ASP.NET Core Razor中处理Ajax请求

    如何ASP.NET Core Razor中处理Ajax请求 在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过.今天闲来无事,准备用Rozor ...

  4. ASP.NET Core Razor页面禁用防伪令牌验证

    在这篇短文中,我将向您介绍如何ASP.NET Core Razor页面中禁用防伪令牌验证. Razor页面是ASP.NET Core 2.0中增加的一个页面控制器框架,用于构建动态的.数据驱动的网站: ...

  5. ASP.NET Core Razor 页面使用指南

    ASP.NET Core Razor 页面作为 ASP.NET Core 2.0的一部分发布,它是基于页面的全新的Web开发框架.如果您想学习如何使用 ASP.NET Core Razor 页面,可以 ...

  6. 学习ASP.NET Core Razor 编程系列一

    一. 概述 .NET Core 1.0发布的时候就想进行学习的,不过根据微软的以往的发布规律1.0版可以认为是大众测试版,2.0才算稳定.现在2.1都已经发布了预览版,之前对其"不稳定&qu ...

  7. 学习ASP.NET Core Razor 编程系列二——添加一个实体

    在Razor页面应用程序中添加一个实体 在本篇文章中,学习添加用于管理数据库中的书籍的实体类.通过实体框架(EF Core)使用这些类来处理数据库.EF Core是一个对象关系映射(ORM)框架,它简 ...

  8. 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  10. 学习ASP.NET Core Razor 编程系列六——数据库初始化

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. Linux如何安装PHPMyAdmin

    1,我们要以root帐号登入 . 2,PHP支持模块安装.在CentOS操作系统安装完毕后,其实PHP支持模块并没有安装上去,如果想使用PhpMyAdmin,首先需要安装PHP支持模块,我们需要两个P ...

  2. Day 11 - 模拟考

    WTP 的大洗牌 题目描述 \(\text{input1}\) 3 1 1 1 1 2 3 \(\text{output1}\) 10 0 数据范围 shuffle.zip 第一题 题目描述 输入格式 ...

  3. 学习笔记--初识Java面向对象

    面向对象与面向过程的区别 面向过程:主要关注具体过程,因果关系 优点:对于业务逻辑比较简单的程序,可以得到快速开发,前期投入成本比较低 缺点:由于面向过程的使用让程序间的元素"耦合度&quo ...

  4. Java JVM——13. 垃圾回收相关算法

    1.生存还是死亡? 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象,GC 才会在执行垃圾回 ...

  5. 利用Elasticsearch实现地理位置、城市搜索服务

    最近用到一些简单的地理位置查询接口,基于当前定位获取用户所在位置信息(省市区),然后基于该信息查询当前区域的......提供服务. 然后就自己研究了下GIS,作为一个程序员.自己能不能实现这个功能呢? ...

  6. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-58 - 文件下载

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  7. ceph 001 存储类型 传统存储与分布式存储 分布式文件系统 集群与分布式

    ceph 存储类型 块存储:裸磁盘 未被格式化的磁盘 DAS(直连存储,usb,硬盘插到电脑):scsi接口 接口数量有限 传输距离有限 SAN(存储区域网络):ip-san 网络(iscsi) 以太 ...

  8. 【Spring-Security】Re10 Oauth2协议 P1 授权码模式 & 密码模式

    一.Oauth2协议: 第三方登录,即忘记本站密码,但是登录界面中提供了一些第三方登录,例如微信.支付宝.QQ.等等,通过第三方授权实现登录 第三方认证技术主要解决的时认证标准,各个平台的登录要遵循统 ...

  9. Ubuntu系统:NVIDIA显卡关闭图形显示 —— 彻底禁用NVIDIA GPU 的显示输出接口 —— ubuntu无桌面方式启动 —— NVIDIA显卡模式切换(显示模式切换为计算模式)

    相关: ubuntu desktop改用无桌面方式启动 在使用Linux做异构计算等科学计算的时候一个常见的问题就是: NVIDIA显卡关闭图形显示 -- 彻底禁用NVIDIA GPU 的显示输出接口 ...

  10. 代码随想录Day6

    454.四数相加Ⅱ 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k ...