使用带有 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 数据推送到数据绑定元素。可能有很多方案可以实现它,这取决于您如何管理记录以及如何处理它们。我将假设您有两个分别名为 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
然后您可以评估返回的 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 服务器存储过程,其中 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 数据推送到数据绑定元素。可能有很多方案可以实现它,这取决于您如何管理记录以及如何处理它们。我将假设您有两个分别名为 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
然后您可以评估返回的 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:分享的代码未经测试,可能需要点赞