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

C# 使用带有JSON字符串列的转发器,c#,asp.net,asprepeater,C#,Asp.net,Asprepeater,我有一个SQL Server存储过程,它返回产品列表。我正在使用转发器在我的网页中显示数据。这一切都很好,并且返回的行也很好。但是,对于每种产品,我希望获得一个功能列表,例如: ProductID、名称、功能 1、T恤,“蓝色,长袖,100%纯棉” 牛仔裤,“蓝色,粗斜纹棉布,石洗” 理想情况下,我希望对proc进行一次数据库调用,一次性返回所有产品及其功能。因此,我认为我需要proc返回三列(ProductID、ProductName、Features),其中Features列是一个JSON数

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

ProductID、名称、功能
1、T恤,“蓝色,长袖,100%纯棉”
牛仔裤,“蓝色,粗斜纹棉布,石洗”

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

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



  • 质地轻盈的面料
  • 圆形v领
  • 100%纯棉


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


我是不是走错了路?

好吧,我不会把JSON数据推送到databound元素。实现这一目标可能有很多方案,这取决于您如何管理记录以及如何处理记录。我将假设您有两个分别名为
Products
Features
的表,它们使用这个模式:
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
然后,您可以计算返回的
数据字段(ProductFeatures)
并将其绑定到中继器中要显示它的任何HTML标记

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

标记:

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

政务司司长:

公共静态字符串GetFeaturesHtml(对象o)
{
如果(o==null | | DBNull.Value.Equals(o))
{
返回“”;
}
var splittedFeatures=o.ToString().Split(',');
var sb=新的StringBuilder(“
    ”); foreach(splittedFeatures中的字符串特征) { sb.Append(string.Format(“
  • {0}
  • ”,feature)); } 某人追加(“
”); 使某人返回字符串(); }
还有其他方法,但这将是更简单有效的方法。希望这有帮助


PS:共享的代码没有经过测试,可能需要一些爱。

为什么不让存储过程返回CSV呢?使用JSON的理由是什么?请让我们看看这些记录来自何处的表模式和一些源代码,以便可以相应地进行修复。是的,这非常有效,正是我想要的。从SQL中提取并不成问题。我只是不知道如何在网页上处理它。您的解决方案非常有效,谢谢您。@TimFoster乐于帮助。如果答案有帮助,一定要投赞成票。
<div><%# GetFeaturesHtml(Eval("ProductFeatures"))%></div>
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();
}