首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >混合C#和Helper标记ASP.NET MVC 6 (ASP.NET核心)

混合C#和Helper标记ASP.NET MVC 6 (ASP.NET核心)
EN

Stack Overflow用户
提问于 2016-03-30 08:15:39
回答 2查看 11.9K关注 0票数 8

我正在使用ASP.NET MVC 6中的新帮助标记。

代码语言:javascript
运行
复制
    <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>

我想要路由属性:

代码语言:javascript
运行
复制
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"

只有在下列情况下才适用:

代码语言:javascript
运行
复制
          {
              if (Model.incBalance == 0)
              {
                  asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
              }
          }

因此,我想得到这样的东西:

代码语言:javascript
运行
复制
    <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")“

我正在使用2015更新1

更新1:我也尝试了这个选项:

代码语言:javascript
运行
复制
@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)

但错误仍然存在:

标记助手'form‘不能在元素的属性声明区域中有C#。 @(Model.incBalance == 0?“asp-yyyy dateNext=”+Model.dataEnd.ToString(“yyyy”):string.Empty)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-30 08:54:00

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

代码语言:javascript
运行
复制
<!-- 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解析器不会解释它,因此不需要是有效的标记(所以上面的东西可以工作)。但是,在原始文本中,标记帮助程序也不会运行,所以这对您没有帮助。

从本质上说,这给你留下了三个选择:

  1. 将所有内容封装在一个巨大的@if中,并在本质上复制整个form标记: @if (条件){所有表单内容}if{所有表单内容} 当然,这很糟糕,因为您需要复制整个表单内容(否则,@if中的标记就不会有良好的格式)。
  2. 编写您自己的标记助手,它封装了@if条件检查背后的逻辑。 这对于更一般的事情来说很好,但是对于添加一个可选属性来说有点乏味。
  3. 如果不满足条件,则使用表达式语法将某些“空值”传递给路由:
票数 11
EN

Stack Overflow用户

发布于 2020-06-08 12:39:28

我现在正在从mvc迁移到aspnet核心3.0,并得到了同样的错误。由于我没有使用任何标记帮助器特性,所以我只需通过注释_viewimports中的行来删除标签导入指令:

代码语言:javascript
运行
复制
@*@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers*@

现在,意见呈现得很愉快。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36303233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档