【问题标题】:Using a repeater with a JSON string column使用带有 JSON 字符串列的中继器
【发布时间】:2020-02-03 22:47:26
【问题描述】:

我有一个返回产品列表的 SQL Server 存储过程。我正在使用repeater 在我的网页中显示数据。这一切都很好,并且行很好地返回。但是,对于每个产品,我都想获得一个功能列表,例如:

ProductID, Name, Features 1, T-Shirt, "Blue, Long sleeved, 100% cotton" 2, Jeans, "Blue, Denim, Stonewashed"

理想情况下,我想对我的 proc 进行一次数据库调用,以一次性返回所有产品及其功能。所以,我认为我需要 proc 返回三列(ProductID、ProductName、Features),其中 features 列是 JSON 数组。

我对 asp.net 非常陌生,甚至对 JSON 也很陌生。我正在使用 c# 并且在 HTML 页面中,我已经能够让 ProductName 和 ProductID 方面工作得很好。我希望它看起来像这样(ul 标签部分是功能):

<div class="card-description"><%# Eval("ProductName") %><br><br>
  <ul>
    <li>Lightweight textured fabric</li> 
    <li>Rounded v-neckline</li> 
    <li>100% cotton</li>
  </ul><br><br>
  Product code: <strong><%# Eval("ProductID") %></strong>
</div>

那么我的问题是 (a) 这是最好的方法吗,以及 (b) 我如何逐行反序列化 JSON?

我是不是走错了路?

【问题讨论】:

  • 为什么不让存储过程返回一个 CSV?使用 JSON 的理由是什么?
  • 请让我们看看这些记录来自哪里的表模式和一些代码隐藏源,以便可以相应地修复它。

标签: c# asp.net asprepeater


【解决方案1】:

好吧,我不会将 JSON 数据推送到数据绑定元素。实现它可能有很多方案,这取决于您如何管理记录以及如何处理它们。我将假设您有两个分别命名为 ProductsFeatures 的表具有以下架构:Products (Id, Name)Features(Id, FeatureDescription, ProductId)

所以,我只是建议您像这样查询您的数据:

SELECT Name AS ProductName, STUFF((SELECT ', ' + FeatureDescription FROM Features WHERE Features.ProductId = Products.Id FOR XML PATH('')), 1, 2, '') AS ProductFeatures FROM Products

然后您可以评估返回的DataField (ProductFeatures) 并将其绑定到您想要显示它的转发器中的任何 HTML 标记。

如果您想自定义记录,您可以使用嵌套的Repeater 控件,当第一个repeater 触发ItemDataBound 事件时,您可以在其中绑定第二个转发器。或者您可以使用如下静态方法处理返回的 CSV 响应:

标记:

<div><%# GetFeaturesHtml(Eval("ProductFeatures"))%></div>

CS:

public static string GetFeaturesHtml(object o)
{
    if(o == null || DBNull.Value.Equals(o))
    {
       return "";
    }
    var splittedFeatures= o.ToString().Split(',');
    var sb = new StringBuilder("<ul>");
    foreach(string feature in splittedFeatures)
    {
        sb.Append(string.Format("<li>{0}</li>", feature));
    }
    sb.Append("</ul>");
    return sb.ToString();
}

还有其他方法,但这是更简单有效的方法。希望这会有所帮助。

PS:分享的代码未经测试,可能需要一些爱心。

【讨论】:

  • 是的,这很完美,正是我想要的。从 SQL 中提取不是问题。我只是不确定如何在网页中处理它。您的解决方案完美运行,谢谢。
  • @TimFoster 乐于助人。如果有帮助,请务必对答案进行投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2016-03-26
  • 1970-01-01
  • 2014-11-08
  • 2014-04-19
  • 2020-06-05
相关资源
最近更新 更多