前言

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. Spring Cloud微服务下如何配置I8n

    什么是I8n 国际化(I18n)指的是设计和开发产品的过程,使得它们能够适应多种语言和文化环境,而不需要进行大量的代码更改.这通常涉及到创建一个基础版本的产品,然后通过配置和资源文件来添加对不同语言和 ...

  2. 浅谈:HTTP 和 HTTPS 通信原理

    1.HTTP基本概念 1.1 HTTP是什么?  HTTP (超文本传输协议)协议被用于在 Web 浏览器和网站服务器之间传递信息, HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻 ...

  3. AT_abc215_d 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\),\(M\) 及含有 \(N\) 个整数的序列 \(A\). 求 \( ...

  4. iOS开发基础135-Core Data

    Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具.Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据.这不仅可以节省 ...

  5. SpringBoot实战:Spring Boot接入Security权限认证服务

    引言 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制的框架,提供了完善的认证机制和方法级的授权功能,是一个非常优秀的权限管理框架.其核心是一组过滤器链,不同的功能经由不 ...

  6. 解决Sqoop导入导出MySQL数据错位问题

    添加--columns "columns,columns,columns" \可以在hive导入mysql时防止数据错位:

  7. 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便

    自动化测试中,QTP和selenium IDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制.个人觉得传统录制工具有些弊端,加上要定 ...

  8. Jmeter函数助手26-logn

    logn函数用于记录一条日志并返回空值. String to be logged (and returned):要打印的字符 Log level (default INFO) or OUT or ER ...

  9. proxmox ve 部署双节点HA集群及glusterfs分布式文件系统

    分布式存储的作用 加入分布式存储的目的:主要是为了对数据进行保护避免因一台服务器磁盘的损坏,导致数据丢失不能正常使用.   参考文档:https://gowinder.work/post/proxmo ...

  10. 13、Spring之JdbcTemplate

    13.1.环境搭建 13.1.1.创建module 13.1.2.选择maven 13.1.3.设置module名称和路径 13.1.4.module初始状态 13.1.5.配置打包方式和依赖 < ...