我正在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属性的格式必须正确。
if (Model.incBalance == 0)
和
标记帮助程序"form"在元素的属性中不能有C#申报区。
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)
但错误仍然存在:
标记帮助程序"form"在元素的属性中不能有C#申报区。
@(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 renderraw文本,Razor解析器不会对其进行解释,因此不需要是有效的标记(因此上述内容可以工作)。然而,在原始文本中,标记帮助程序也不会运行,所以这对您没有帮助。
这让你现在基本上有三个选择:
将所有内容包装在一个巨大的
@if
中,并基本上复制整个form
标签:@if (condition) { <form with-that-extra="attribute"> All the form content </form> } else { <form> All the form content </form> }
当然,这太可怕了,因为您需要真正复制整个表单内容(否则,
@if
中的标签就不会很好地形成)。编写自己的标记助手,它封装了
@if
条件检查背后的逻辑。这对于更一般的事情来说效果很好,但对于添加可选属性来说有点乏味。
如果不满足条件,则使用表达式语法将一些"null值"传递给路由:
<form … asp-route-dateNext="@(Model.incBalance == 0 ? Model.dataEnd.ToString("yyyy-MM-dd") : null)"> </form>
这可能是最简单的解决方案。默认值
null
也会阻止标记助手为该属性运行,所以就好像完全忽略了它一样。
我现在正在从mvc迁移到aspnet core 3.0,但也遇到了同样的错误。由于我没有使用任何标记助手功能,所以我只是简单地通过注释_viewimportsby:中的行来删除标记助手导入指令
@*@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers*@
现在视图呈现得很愉快。