为什么我的Razor代码不能与ASP.NET Core中的标签帮助程序一起使用

时间:2019-01-03 16:43:44

标签: razor asp.net-core asp.net-core-mvc tag-helpers asp.net-core-tag-helpers

我在前面的问题是,为什么剃刀语法在我使用标签助手的标签内不起作用?这是我可以解决的问题,HERE已回答了该问题的解决方案,但我仍然无法找出发生此问题的原因。


作为一个例子,我有一个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内部使用剃刀会输出以下

<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似乎可以正常工作,这是我使用它尝试尝试添加诸如标记属性之类的问题时遇到的。如前所述,我只是想了解为什么会这样。

1 个答案:

答案 0 :(得分:1)

您不能在标签本身内使用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"不等于0,您将得到Model.Id,如果为0,则根本没有禁用的属性。您不需要做任何疯狂的事情,如链接问题中所提示的答案一样。

编辑

仔细考虑一下,我认为它只是因为将标签分成多行而通过了,因此基本上Razor会将周围的标签视为无效的HTML,并在可以解析的行上进行了修整(三元表达式)。我想如果将标签放在一行中,实际上会得到一个例外。无论哪种方式,都是语法错误。