gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:22:04 26 4
gpt4 key购买 nike

我在 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 attributes must be well-formed.

          if (Model.incBalance == 0)

The tag helper 'form' must not have C# in the element's attribute declaration area.

              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)

但错误依旧:

The tag helper 'form' must not have C# in the element's attribute declaration area.

      @(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 呈现 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 也将阻止标签助手为该属性运行,所以就好像您完全省略了它一样。

关于c# - 混合 C# 和 HTML Helper 标签 ASP.NET MVC 6 (ASP.NET Core),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36303233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com