razor - 为什么我的 Razor 代码不能与 ASP.NET Core 中的标记帮助程序一起使用
问题描述
我的问题是为什么剃刀语法在我使用标签助手的标签内不起作用?这是我可以解决的问题,并且已在此处回答了该问题的解决方案,但我仍然无法找出为什么会出现此问题。
作为一个例子,我有一个选择标签,我试图添加一个禁用属性,仅当模型具有某个属性时。这是html:
<select
@(Model.Id != 0 ? "disabled" : "")
asp-for="QuestionType"
asp-items="Html.GetEnumSelectList<Enums.QuestionTypes>()"
id="form-type" data-parsley-required class="form-control">
</select>
在选择中使用 Razor 会输出以下内容
<select
asp-for="QuestionType"
asp-items="Html.GetEnumSelectList<Enums.QuestionTypes>()"
id="form-type" data-parsley-required="" class="form-control">
</select>
不使用 Razor 给出了这个
<select
id="form-type" data-parsley-required="" class="form-control"
data-val="true" data-val-required="The QuestionType field is required."
name="QuestionType">
<option selected="selected" value="0">Drop Down</option>
<option value="10">Free Response</option>
</select>
在使用 Razor 语法时,它似乎忽略了标记帮助程序,并且没有按应有的方式(或预期的方式)构建 HTML。但是,在属性值中使用 razor 似乎工作正常,当我使用它来尝试添加诸如标签属性之类的东西时,我会遇到这些问题。如前所述,我只是想了解为什么会发生这种情况。
解决方案
您不能在标签本身内使用 Razor 表达式,只能在属性的引号内使用。我实际上很惊讶它没有引发异常,但似乎它只是选择将标签视为纯文本。无论如何,您需要执行以下操作:
<select
disabled="@(Model.Id != 0 ? "disabled" : null)"
asp-for="QuestionType"
asp-items="@Html.GetEnumSelectList<Enums.QuestionTypes>()"
id="form-type" data-parsley-required class="form-control">
</select>
如果某个属性的值为 null,Razor 将删除它,因此您最终会得到disabled="disabled"
ifModel.Id
不等于 0,如果是则根本没有禁用属性。您不需要像链接问题中的答案所建议的那样做任何疯狂的事情。
编辑
再想一想,我认为它只是因为你将标签分成多行而通过,所以基本上 Razor 将周围的标签视为无效的 HTML,并在它可以解析的行(三元表达式)上磨练。我想如果你把标签放在一行中,你实际上会得到一个例外。无论哪种方式,这都是语法错误。
推荐阅读
- javascript - 合并两个要共同引用的 HTML 元素对象
- data-structures - 每个节点有 [0, n] 个已知子节点和 [0, 1] 个未知父节点的数据结构的名称?
- python - pyodbc.connect - 在一台计算机上工作,但不能在另一台计算机上工作
- c++ - 如何检测悬停在静态 Win32 控件上?
- scrapy - 下载器中间件、请求和响应
- azure - 在 Cosmos DB 中使用页面大小和页码进行分页
- python-3.x - 抓取 API 时获取下一页
- javascript - 识别 Typescript 中接口和类之间的多态性
- javascript - 如何使用 Croppr.js 获取裁剪后的图像?
- javascript - 如何使用外部 JavaScript 库