【问题标题】:ASP.NET Core Razor: Conditional attribute without valueASP.NET Core Razor:没有值的条件属性
【发布时间】:2019-04-24 19:39:12
【问题描述】:

我想有条件地在<input> 中呈现readonly 属性。在 Razor 的 ASP.NET Core 方言中,属性的解释与 System.Web.Mvc 略有不同。

在 System.Web.Mvc 中我曾经这样做过:

<input name="Name" class="form-control" @(Model.MyCondition ? "readonly" : "") />

在 ASP.NET Core 中,同样的方法不起作用:没有错误,但属性也没有呈现。

<input asp-for="Name" class="form-control" @(Model.MyCondition ? "readonly" : "" ) />

一旦属性出现在 HTML 中,它就会被强制执行,所以我不能对属性的 value 做任何事情。这个 sn-p 会导致输入总是是只读的:

<input asp-for="Name" class="form-control" readonly="@(Model.MyCondition ? "readonly" : "" )" />

现在,我可以通过创建一个响应is-readonly 标签的标签助手来解决问题,但对于这么简单的事情来说,这似乎非常复杂。

如何在不借助自定义标签助手的情况下有条件地呈现无值属性?

【问题讨论】:

  • 我在 razor 页面测试它在我这边工作,当 MyCondition 为 true 时它显示 readonly 属性,你能分享重现的步骤吗?

标签: asp.net-core razor


【解决方案1】:

如果在条件不匹配时将值设置为null(而不是空字符串),则不会呈现属性,如下所示:

<input asp-for="Name" class="form-control" readonly="@(Model.MyCondition ? "readonly" : null )" />

【讨论】:

  • 这似乎对我不起作用。它仍然呈现没有值的“只读”属性
  • 这对我来说绝对适用于 ASP.NET Core 3.1;我什至检查了原始来源以确认。也就是说,我使用的是disabled 值而不是readonly(但它们应该工作相同)。我还使用了asp-for 属性,如果这有什么不同的话。
  • @Pluto 这很奇怪,因为任何attribute="@(nullValuedVariable)" 在.net core 3.1 mvc 中为我呈现attribute=""
  • @Feri 我想知道它是否与 Razor 编译页面有关,并且如果有明确的空检查,则仅对行为进行编程以跳过输出属性。您是否尝试使用条件表达式而不是仅输出变量?这种不一致的行为一定是有原因的。我知道@(obj == null ? null : obj) 是愚蠢的,但使用 ASP.NET 它可能会工作 LOL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多