Использование повторителя со строковым столбцом JSON - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть SQL Сервер, на котором хранится pro c, который возвращает список продуктов. Я использую repeater для отображения данных на моей веб-странице. Все это прекрасно работает, и строки возвращаются красиво. Тем не менее, для каждого продукта я хочу получить список функций, например:

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

В идеале, я хочу сделать один вызов из базы данных своему профессионалу c, чтобы вернуть все продукты и их функции в одном go. Итак, я думаю, что мне нужно, чтобы pro c возвратил три столбца (ProductID, ProductName, 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>

Мой вопрос: а) это лучший способ сделать это, и б) как мне это сделать? десериализовать JSON построчно?

Неправильно ли я подхожу к этому?

1 Ответ

1 голос
/ 04 февраля 2020

Ну, я бы не стал выдвигать данные JSON в элемент данных. Для этого может быть много сценариев ios, и это зависит от того, как вы управляете своими записями и как они обрабатываются. Я предполагаю, что у вас есть две таблицы с именами 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-ответ, используя метод Stati c, как показано ниже:

Разметка:

<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: Общий код не проверен, и может потребоваться некоторая любовь.

...