显式 Razor 表达式在 @foreach 输出模型属性中不起作用并与文本连接

Posted

技术标签:

【中文标题】显式 Razor 表达式在 @foreach 输出模型属性中不起作用并与文本连接【英文标题】:Explicit Razor expressions not working in @foreach output model property and concatenate with text 【发布时间】:2021-11-16 00:02:48 【问题描述】:

我想创建以下标记

     <tr onclick="toggle(110)" data-order-id-110=110><td>foo</td></tr>

重要的部分是data-attribute data-order-id-110=110。对于我模型中的每个项目,id(此处为 110)应写为包含 id 在本例中为 110 的数据属性。

根据我对Explicit Razor expressions的理解

@() 括号内的任何内容都会被评估并呈现到输出。

写出来应该够用了

// this code
data-order-id-@(@order.Id)=@order.Id

// actual returns 
data-order-id@(@order.id)="1"

// expected
data-order-id-1="1"
  

所以除了@(@),我也试过@=@这样

 data-order-id-@(@order.Id)=@order.Id
 data-order-id-@=@order.Id=@order.Id

两者都不起作用,见下文。

我的代码

我试过了

  <tr onclick="toggleOrderDetails(@order.Id)" 
      data-order-id-@(order.Id)=@order.Id>

返回

 <tr onclick="toggleOrderDetails(1)" data-order-id-@(order.id)="1">
       .....
        </tr>

也试过了

 @foreach (var order in Model.Orders)
 
     <tr onclick="toggleOrderDetails(@order.Id)" data-order-id-@=@order.Id=@order.Id>
            <td>@order.Id</td>
            <td>@order.CustomerId</td>
            <td>@order.OrderDate</td>
     </tr> 
 

html 输出

 <tr onclick="toggleOrderDetails(1)" data-order-id-@="1=1">
            <td>1</td>
            <td>1</td>
            <td>26.08.2021 10:30:00</td>
  </tr>

正如您所见,data-order-id-1=1 的字符串 data-order-id-@="1=1 已创建。

预期:data-order-id-1=1 实际:data-order-id-@="1=1

其他人向我们提及@:,但这不起作用

安装版本

dotnet --info

返回

 .NET Core SDK (reflecting any global.json):
      Version:   3.1.118     Commit:    42170158ee

 Host (useful for support):
      Version: 3.1.18        Commit:  5d3919d34e

 .NET Core SDKs installed:
      3.1.118 [C:\Program Files\dotnet\sdk]

 .NET Core runtimes installed:
      Microsoft.AspNetCore.App 3.1.18 
      Microsoft.NETCore.App 3.1.18 
      Microsoft.WindowsDesktop.App 3.1.18 

class MvcServiceCollectionExtensions 的组件是

#region Assembly Microsoft.AspNetCore.Mvc
         , Version=3.1.0.0, Culture=neutral
         , PublicKeyToken=adb9793829ddae60
         // Microsoft.AspNetCore.Mvc.dll
#endregion

问题

我需要什么将 html 数据属性与模型中的属性连接起来

【问题讨论】:

尝试将@(@order.id) 改为@Html.Raw(order.id) 应该没问题 我认为你应该用data-order-id-@(order.Id)=@order.Id替换data-order-id-@=@order.Id=@order.Id @ɐsɹǝʌǝɔıʌ 这个我也试过了,见上面的更新 我不明白为什么data-order-id-@order.Id=@order.Id 不起作用? @daremachine:这个&lt;tr onclick="toggleOrderDetails(@order.Id)" data-order-id-@Html.Raw(order.id)=@order.Id&gt;返回这个标记&lt;tr onclick="toggleOrderDetails(1)" data-order-id-@html.raw(order.id)="1"&gt; .... &lt;/tr&gt; 【参考方案1】:

我能够像这样解决它

@foreach (var order in Model.Orders)

    string attribute = "data-order-id-"+@order.Id;
    <tr onclick="toggleOrderDetails(@order.Id)" @(attribute)=@order.Id>

这会返回这个标记

 <tr onclick="toggleOrderDetails(1)" data-order-id-1="1">
       ....
 </tr>

【讨论】:

以上是关于显式 Razor 表达式在 @foreach 输出模型属性中不起作用并与文本连接的主要内容,如果未能解决你的问题,请参考以下文章

在 Knockout foreach 循环中编写 HTML 代码(通过 Razor 调用)

c# razor mvc textboxfor in foreach 循环

如果在foreach循环下动态生成Textarea不止一次,如何在Razor(blazor)组件中获取Textarea值

razor foreach使用ICollection

C# MVC 4 RAZOR - JSON 使用 @foreach 从控制器返回列表到视图

如果 Razor 视图中的 foreach 无法识别条件