混合 C# 和 HTML Helper 标签 ASP.NET MVC 6 (ASP.NET Core)
Mixing C# and HTML Helper tags ASP.NET MVC 6 (ASP.NET Core)
我正在使用 ASP.NET MVC 6 中的新 Helper 标签。
<form asp-area="DAS"
asp-controller="Report"
asp-action="Add"
asp-route-id="@Model.id"
asp-route-incBalance="@Model.incBalance"
asp-route-dateSet="@Model.dataStart.ToString("yyyy-MM-dd")"
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
method="post" role="form">
</form>
我要路由属性:
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
仅适用于:
{
if (Model.incBalance == 0)
{
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
}
}
因此,我想得到这样的东西:
<form asp-area="DAS"
asp-controller="Report"
asp-action="Add"
asp-route-id="@Model.id"
asp-route-incBalance="@Model.incBalance"
asp-route-dateSet="@Model.dataStart.ToString("yyyy-MM-dd")"
{
if (Model.incBalance == 0)
{
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
}
}
method="post" role="form">
</form>
我收到这些错误:
TagHelper attributes must be well-formed.
if (Model.incBalance == 0)
和
The tag helper 'form' must not have C# in the element's attribute
declaration area.
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
我正在使用 Visual Studio 2015 更新 1
更新 1:
我也试过这个选项:
@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
但错误依旧:
The tag helper 'form' must not have C# in the element's attribute
declaration area.
@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
使用 Razor,标记的每个部分都必须格式正确。你不能有悬空的开始标签,或者 Razor 表达式的中断标记。所以这样的事情是无效的,因此会导致语法错误:
<!-- Interrupting a tag -->
<div
@if (condition) {
attribute="bar"
}
>
<!-- Also not possible: Conditionally opening tags -->
if (condition) {
<span>
}
Some text
if (condition) {
</span>
}
因此您必须确保 Razor 表达式中的标记(基本上是花括号之间的所有内容)是有效的表达式,并且标记始终是完整的。
不幸的是,这意味着您不能使用 @if
有条件地添加属性(无论该属性是否为标签助手属性)。
如果它只是普通的 HTML,您可以让 Razor 渲染 raw 文本,Razor 解析器不解释它,因此不需要有效的标记(所以上面的东西会起作用)。然而,在原始文本中,标签助手也不会 运行,所以这对你没有帮助。
现在基本上只剩下三个选择:
将所有内容包裹在一个巨大的 @if
中并基本上复制整个 form
标签:
@if (condition) {
<form with-that-extra="attribute">
All the form content
</form>
}
else {
<form>
All the form content
</form>
}
当然,这很糟糕,因为您需要真正复制整个表单内容(否则,@if
中的标签格式不正确)。
编写您自己的标签助手,它封装了 @if
条件检查背后的逻辑。
这适用于更一般的事情,但仅用于添加可选属性有点乏味。
如果条件不满足,使用表达式语法将一些“空值”传递给路由:
<form …
asp-route-dateNext="@(Model.incBalance == 0 ? Model.dataEnd.ToString("yyyy-MM-dd") : null)">
</form>
这可能是最简单的解决方案。那里的默认值 null
也会阻止标签助手 运行 为那个属性设置,所以就好像你完全省略了它一样。
我现在从mvc迁移到aspnet core 3.0,也遇到同样的错误。
因为我没有使用任何标签助手功能,所以我只是通过注释 _viewimports 中的行来简单地删除 taghelper 导入指令:
@*@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers*@
现在视图呈现得很愉快。
我正在使用 ASP.NET MVC 6 中的新 Helper 标签。
<form asp-area="DAS"
asp-controller="Report"
asp-action="Add"
asp-route-id="@Model.id"
asp-route-incBalance="@Model.incBalance"
asp-route-dateSet="@Model.dataStart.ToString("yyyy-MM-dd")"
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
method="post" role="form">
</form>
我要路由属性:
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
仅适用于:
{
if (Model.incBalance == 0)
{
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
}
}
因此,我想得到这样的东西:
<form asp-area="DAS"
asp-controller="Report"
asp-action="Add"
asp-route-id="@Model.id"
asp-route-incBalance="@Model.incBalance"
asp-route-dateSet="@Model.dataStart.ToString("yyyy-MM-dd")"
{
if (Model.incBalance == 0)
{
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
}
}
method="post" role="form">
</form>
我收到这些错误:
TagHelper attributes must be well-formed.
if (Model.incBalance == 0)
和
The tag helper 'form' must not have C# in the element's attribute declaration area.
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
我正在使用 Visual Studio 2015 更新 1
更新 1: 我也试过这个选项:
@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
但错误依旧:
The tag helper 'form' must not have C# in the element's attribute declaration area.
@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
使用 Razor,标记的每个部分都必须格式正确。你不能有悬空的开始标签,或者 Razor 表达式的中断标记。所以这样的事情是无效的,因此会导致语法错误:
<!-- Interrupting a tag -->
<div
@if (condition) {
attribute="bar"
}
>
<!-- Also not possible: Conditionally opening tags -->
if (condition) {
<span>
}
Some text
if (condition) {
</span>
}
因此您必须确保 Razor 表达式中的标记(基本上是花括号之间的所有内容)是有效的表达式,并且标记始终是完整的。
不幸的是,这意味着您不能使用 @if
有条件地添加属性(无论该属性是否为标签助手属性)。
如果它只是普通的 HTML,您可以让 Razor 渲染 raw 文本,Razor 解析器不解释它,因此不需要有效的标记(所以上面的东西会起作用)。然而,在原始文本中,标签助手也不会 运行,所以这对你没有帮助。
现在基本上只剩下三个选择:
将所有内容包裹在一个巨大的
@if
中并基本上复制整个form
标签:@if (condition) { <form with-that-extra="attribute"> All the form content </form> } else { <form> All the form content </form> }
当然,这很糟糕,因为您需要真正复制整个表单内容(否则,
@if
中的标签格式不正确)。编写您自己的标签助手,它封装了
@if
条件检查背后的逻辑。这适用于更一般的事情,但仅用于添加可选属性有点乏味。
如果条件不满足,使用表达式语法将一些“空值”传递给路由:
<form … asp-route-dateNext="@(Model.incBalance == 0 ? Model.dataEnd.ToString("yyyy-MM-dd") : null)"> </form>
这可能是最简单的解决方案。那里的默认值
null
也会阻止标签助手 运行 为那个属性设置,所以就好像你完全省略了它一样。
我现在从mvc迁移到aspnet core 3.0,也遇到同样的错误。 因为我没有使用任何标签助手功能,所以我只是通过注释 _viewimports 中的行来简单地删除 taghelper 导入指令:
@*@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers*@
现在视图呈现得很愉快。