首页 > 解决方案 > 为什么我的 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 似乎工作正常,当我使用它来尝试添加诸如标签属性之类的东西时,我会遇到这些问题。如前所述,我只是想了解为什么会发生这种情况。

标签: razorasp.net-coreasp.net-core-mvctag-helpersasp.net-core-tag-helpers

解决方案


您不能在标签本身内使用 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,并在它可以解析的行(三元表达式)上磨练。我想如果你把标签放在一行中,你实际上会得到一个例外。无论哪种方式,这都是语法错误。


推荐阅读