为什么我的 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 并在它可以解析的行上磨练(三元表达式)。我想如果你把标签放在一行中,你实际上会得到一个异常。无论哪种方式,它都是一个语法错误。
我的问题是为什么 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 并在它可以解析的行上磨练(三元表达式)。我想如果你把标签放在一行中,你实际上会得到一个异常。无论哪种方式,它都是一个语法错误。