为什么我的 Razor 代码不能在 ASP.NET Core 中使用标签助手

Why Is My Razor Code Not Working With Tag Helpers in ASP.NET Core

我的问题是为什么 razor 语法在我使用标签助手的标签内不起作用?这是我可以解决的问题,问题的解决方案已得到解答 ,但我仍然无法找出出现此问题的原因。


作为一个例子,我有一个 select 标签,我试图仅在模型具有特定 属性 时才向其添加禁用属性。这是 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>

在 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 将删除它,所以如果 Model.Id 不等于 0,你最终会得到 disabled="disabled",如果没有禁用的属性这是。您不需要像链接问题中的答案那样做任何疯狂的事情。

编辑

仔细想想,我认为它之所以成功是因为你将标签分成多行,所以基本上 Razor 将周围的标签视为无效 HTML 并在它可以解析的行上磨练(三元表达式)。我想如果你把标签放在一行中,你实际上会得到一个异常。无论哪种方式,它都是一个语法错误。