我在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)
和
标签助手&#39;表格&#39;不得在元素的属性中使用C# 宣言区。
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
我正在使用Visual Studio 2015 Update 1
更新1: 我也试过这个选项:
@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
但错误仍然存在:
标签助手&#39;表格&#39;不得在元素的属性中使用C# 宣言区。
@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
答案 0 :(得分:3)
使用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渲染原始文本,这不是由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
也会阻止标记帮助程序为该属性运行,因此就像完全省略它一样。
答案 1 :(得分:2)
我现在正从mvc迁移到aspnet core 3.0,并且遇到了同样的错误。 由于我没有使用任何标签助手功能,因此只需通过以下方式将_viewimports中的行注释为:
即可删除taghelper import指令。@*@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers*@
现在快乐地呈现视图。