我在前面的问题是,为什么剃刀语法在我使用标签助手的标签内不起作用?这是我可以解决的问题,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似乎可以正常工作,这是我使用它尝试尝试添加诸如标记属性之类的问题时遇到的。如前所述,我只是想了解为什么会这样。
答案 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,并在可以解析的行上进行了修整(三元表达式)。我想如果将标签放在一行中,实际上会得到一个例外。无论哪种方式,都是语法错误。