使用带有 JSON 字符串列的转发器

Using a repeater with a JSON string column

我有一个 SQL 服务器存储过程,其中 return 是一个产品列表。我正在使用 repeater 在我的网页中显示数据。这一切都很好,行 return 编辑得很好。但是,对于每个产品,我都想获得一个功能列表,例如:

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

理想情况下,我想对我的 proc 进行一次数据库调用,以一次性 return 所有产品及其功能。所以,我认为我需要 return 三列(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?

我是不是用错了方法?

好吧,我不会将 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:分享的代码未经测试,可能需要点赞