【问题标题】:Mixing C# and HTML Helper tags ASP.NET MVC 6 (ASP.NET Core)混合 C# 和 HTML Helper 标签 ASP.NET MVC 6 (ASP.NET Core)
【发布时间】:2016-07-18 03:01:36
【问题描述】:

我在 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)

标签助手“表单”的元素属性中不得包含 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)

但错误仍然存​​在:

标签助手“表单”的元素属性中不得包含 C# 申报区。

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

【问题讨论】:

  • 我认为您的解决方案是不完全排除“asp-route-dateNext”,而是能够传递可为空的日期时间/空字符串或可以在控制器中处理的内容。在表单标签中对该属性设置条件,而是在控制器上处理,这实际上没有任何意义。有没有具体的原因?

标签: c# asp.net-core asp.net-core-mvc asp.net-core-1.0 tag-helpers


【解决方案1】:

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

@*@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers*@

现在可以愉快地渲染视图了。

【讨论】:

    【解决方案2】:

    使用 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 解析器解释,因此不需要是有效的标记(所以上面的东西可以工作) .但是,在原始文本中,标签助手也不会运行,所以这对您没有帮助。

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

    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. 如果条件不满足,使用表达式语法将一些“空值”传递给路由:

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

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

    【讨论】:

    • 将属性设置为 null 将阻止它在 Html 中呈现
    • 选项 3(传递 null 以完全不输出任何属性)非常适合 HTML5 disabled 属性,否则它没有任何开/关值。
    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2016-04-26
    相关资源
    最近更新 更多