混合使用C#和HTML Helper标记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属性的格式必须正确。

          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解析器不会对其进行解释,因此不需要是有效的标记(因此上述内容可以工作)。然而,在原始文本中,标记帮助程序也不会运行,所以这对您没有帮助。

这让你现在基本上有三个选择:

  1. 将所有内容包装在一个巨大的@if中,并基本上复制整个form标签:

    @if (condition) {
        <form with-that-extra="attribute">
            All the form content
        </form>
    }
    else {
        <form>
            All the form content
        </form>
    }
    

    当然,这太可怕了,因为您需要真正复制整个表单内容(否则,@if中的标签就不会很好地形成)。

  2. 编写自己的标记助手,它封装了@if条件检查背后的逻辑。

    这对于更一般的事情来说效果很好,但对于添加可选属性来说有点乏味。

  3. 如果不满足条件,则使用表达式语法将一些"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*@

现在视图呈现得很愉快。

最新更新