前言

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. 「Pygors跨平台GUI」2:安装MinGW-w64、MSYS2还是WSL2

    「Pygors系列」一句话导读: MinGW-w64只有编译器,MSYS2带着更新环境,WSL2实用性比较高 历史与渊源   Windows平台 Linux平台 二进制兼容 WSL2:运行Linux程 ...

  2. git 怎么将某个开发分支最近几次的提交合并成一次提交

    1. 切换到开发分支: git checkout dev 2. 运行交互式 rebase 命令,并指定要合并的提交数量(在这个例子中是最近的3次提交): git rebase -i HEAD~3 3. ...

  3. Pandas库学习笔记(4)---Pandas DataFrame

    Pandas DataFrame Pandas DataFrame基本操作 DataFrame是二维数据结构,即,数据以表格形式在行和列中对齐. DataFrame的功能 潜在的列是不同类型的 大小可 ...

  4. Django 实现文件上传下载API

    Django 实现文件上传下载API by:授客 QQ:1033553122 欢迎加入全国软件测试交流QQ群7156436 开发环境   Win 10   Python 3.5.4   Django- ...

  5. (六)Redis 消息队列 List、Streams

    Redis 适合做消息队列吗?有什么解决方案?首先要明白消息队列的消息存取需求和工作流程. 1.消息队列 我们一般把消息队列中发送消息的组件称为生产者,把接收消息的组件称为消费者,下图是一个通用的消息 ...

  6. 探索Amazon S3:存储解决方案的基石(Amazon S3使用记录)

    探索Amazon S3:存储解决方案的基石 本文为上一篇minio使用的衍生版 相关链接:1.https://www.cnblogs.com/ComfortableM/p/18286363 ​ 2.h ...

  7. 【MySQL】主从配置

    一主一从(或二从)部署: 参考博客: https://www.cnblogs.com/lelehellow/p/9633315.html 正好借着3台机器,可以做一个 1主 2从的分配 192.168 ...

  8. 【DataBase】MySQL 26 存储过程

    一.概述 存储过程&函数,类似编程语言的方法 什么是方法? 完成特定功能的一组语句 方法的特点 1.可重用性 2.简化操作 二.存储过程[ Stored Procedures]: 一组预先编译 ...

  9. 读《Simple statistical gradient-following algorithms for connectionist reinforcement learning》论文 提出Reinforce算法的论文

    <Simple statistical gradient-following algorithms for connectionist reinforcement learning>发表于 ...

  10. 2023.4.12.汇报.pptx

    6月份汇报想法    8月份写论文 ==========================================================