混合 C# 和 HTML Helper 标签 ASP.NET MVC 6 (ASP.NET Core)

Kol*_*Net 7 c# asp.net-core-mvc tag-helpers asp.net-core asp.net-core-1.0

我在 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>
Run Code Online (Sandbox Code Playgroud)

我想路由属性:

asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
Run Code Online (Sandbox Code Playgroud)

仅适用于:

          {
              if (Model.incBalance == 0)
              {
                  asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
              }
          }
Run Code Online (Sandbox Code Playgroud)

结果,我想得到这样的东西:

    <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>
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

TagHelper 属性必须格式良好。

          if (Model.incBalance == 0)
Run Code Online (Sandbox Code Playgroud)

标签助手“表单”在元素的属性声明区域中不得包含 C#。

              asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
Run Code Online (Sandbox Code Playgroud)

我正在使用 Visual Studio 2015 更新 1

更新 1: 我也试过这个选项:

@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
Run Code Online (Sandbox Code Playgroud)

但错误仍然存​​在:

标签助手“表单”在元素的属性声明区域中不得包含 C#。

      @(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
Run Code Online (Sandbox Code Playgroud)

pok*_*oke 8

使用 Razor,标记的每个部分都必须格式良好。您不能有悬空的开始标签,也不能中断 Razor 表达式的标记。所以这样的事情是无效的,因此会导致语法错误:

<!-- Interrupting a tag -->
<div
@if (condition) {
     attribute="bar"
}
>

<!-- Also not possible: Conditionally opening tags -->
if (condition) {
    <span>
}
Some text
if (condition) {
    </span>
}
Run Code Online (Sandbox Code Playgroud)

所以你必须确保 Razor 表达式中的标记,基本上是大括号之间的所有内容,都是一个有效的表达式,并且标签总是完整的。

不幸的是,这意味着您不能使用@if有条件地添加属性(无论这是否是标签助手属性)。

如果它只是普通的 HTML,你可以让 Razor 呈现原始文本,它不会被 Razor 解析器解释,因此不需要是有效的标记(所以上面的东西会起作用)。但是,在原始文本中,标签助手也不会运行,因此在这里对您没有帮助。

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

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

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

    当然,这很糟糕,因为您需要真正复制整个表单内容(否则,其中的标签@if将不会形成良好的格式)。

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

    这适用于更一般的事情,但仅添加可选属性就有点乏味。

  3. 如果不满足条件,则使用表达式语法将一些“空值”传递给路由:

    <form …
        asp-route-dateNext="@(Model.incBalance == 0 ? Model.dataEnd.ToString("yyyy-MM-dd") : null)">
    </form>
    
    Run Code Online (Sandbox Code Playgroud)

    这可能是最简单的解决方案。null那里的默认值也会阻止标签助手为该属性运行,所以就好像你完全省略了它。


小智 6

我现在从 mvc 迁移到 aspnet core 3.0,并遇到了相同的错误。因为我没有使用任何标签帮助器功能,所以我只是通过注释 _viewimports 中的行来删除 taghelper 导入指令:

@*@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers*@
Run Code Online (Sandbox Code Playgroud)

现在景色令人愉快。