【问题标题】:Why Is My Razor Code Not Working With Tag Helpers in ASP.NET Core为什么我的 Razor 代码无法使用 ASP.NET Core 中的标记帮助程序
【发布时间】:2019-01-03 16:43:43
【问题描述】:

我的问题是,为什么 razor 语法在我使用标签助手的标签内不起作用?这是我可以解决的问题,问题的解决方案已得到答复HERE,但我仍然无法找出为什么会出现此问题。


作为一个例子,我有一个选择标签,我试图添加一个禁用属性,仅当模型具有特定属性时。这是html:

<select 
  @(Model.Id != 0 ? "disabled" : "") 
  asp-for="QuestionType" 
  asp-items="Html.GetEnumSelectList<Enums.QuestionTypes>()" 
  id="form-type" data-parsley-required class="form-control">
</select>

在选择中使用 Razor 会输出以下内容

<select 
  asp-for="QuestionType" 
  asp-items="Html.GetEnumSelectList<Enums.QuestionTypes>()" 
  id="form-type" data-parsley-required="" class="form-control">
</select>

不使用 Razor 会出现这种情况

<select 
  id="form-type" data-parsley-required="" class="form-control" 
  data-val="true" data-val-required="The QuestionType field is required." 
  name="QuestionType">
  <option selected="selected" value="0">Drop Down</option>
  <option value="10">Free Response</option>
</select>

在使用 Razor 语法时,它似乎忽略了标签助手,并且没有按应有的方式(或预期的方式)构建 HTML。但是,在属性值中使用 razor 似乎工作正常,当我使用它来尝试添加诸如标签属性之类的东西时,我会遇到这些问题。如前所述,我只是想了解为什么会发生这种情况。

【问题讨论】:

    标签: razor asp.net-core asp.net-core-mvc tag-helpers asp.net-core-tag-helpers


    【解决方案1】:

    您不能在标签本身内使用 Razor 表达式,只能在属性的引号内使用。我实际上很惊讶它没有引发异常,但似乎它只是选择将标签视为纯文本。无论如何,您需要执行以下操作:

    <select 
      disabled="@(Model.Id != 0 ? "disabled" : null)"
      asp-for="QuestionType" 
      asp-items="@Html.GetEnumSelectList<Enums.QuestionTypes>()" 
      id="form-type" data-parsley-required class="form-control">
    </select>
    

    如果属性的值为 null,Razor 将删除它,因此如果 Model.Id 不等于 0,您将得到 disabled="disabled",如果是,则根本没有禁用属性。您无需像链接问题中的答案所建议的那样做任何疯狂的事情。

    编辑

    再想一想,我认为它只是因为您将标签分成多行而通过,所以基本上 Razor 将周围的标签视为无效的 HTML,并在它可以解析的行(三元表达式)上进行磨练。我想如果你把标签放在一行中,你实际上会得到一个例外。无论哪种方式,这都是语法错误。

    【讨论】:

    • 我可以确认错误是不是,因为它是多行编写的。我能够使用 input 等单行标签助手完美地重现此问题。
    • 实际上@ChrisPratt,您的解决方案运行良好,我只是在测试时混淆了语法,所以谢谢!这肯定比编写我自己的标签助手要快得多!
    • 经过一些测试,今天早些时候,我设法发现标签助手在复制时甚至没有被触发(例如,从未调用 Process 方法,也没有定义任何标签助手属性)问题。所以,我们需要知道为什么会发生这种情况,因为标签助手代码中没有任何线索。
    • @Chris Pratt 这是other question 的一个很好的答案。
    • 标签助手没有被使用,因为标签没有被识别为它可以操作的东西,由于 Razor 语法错误。就这么简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2021-07-19
    相关资源
    最近更新 更多