Member 8107173 Ответов: 1

Как заполнить массив JSON в ASP:repeater


Я застрял с портированием и форматированием массива JSON в ASP:Repeater
Массив JSON:
{"root":[{"prog_id":"P1000004","prog_name":"Course1","prog_banner":"","isClientActive":"","courses":[{"course_id":"C1000012","course_name":"Course1-1","course_description":"","course_thumbnail":""},{"course_id":"C1000013","course_name":"Course1-2","course_description":"","course_thumbnail":""}]},{"prog_id":"P1000010","prog_name":"Course2","prog_banner":"1000010.jpg","isClientActive":"active","courses":[{"course_id":"C1000007","course_name":"Course2-1","course_description":"","course_thumbnail":""},{"course_id":"C1000008","course_name":"Course2-2","course_description":"","course_thumbnail":""},{"course_id":"C1000009","course_name":"Course2-3","course_description":"","course_thumbnail":""},{"course_id":"C1000010","course_name":"Course2-4","course_description":"","course_thumbnail":""},{"course_id":"C1000011","course_name":"Course2-5","course_description":"","course_thumbnail":""}]}]}

ток на выходе:
P1000004: Course1
Canorous_Academy.test.Cours[]
P1000010: Course2
Canorous_Academy.test.Cours[]

Желаемый результат (должен выглядеть так):
Repeater-Item 1
P1000004: Course1
Courses:
Course1-1
Course1-2

Repeater-Item 2
P1000010: Course2
Courses:
Course2-1
Course2-2
Course2-3
Course2-4
Course2-5


Что я уже пробовал:

код ASP
<asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
                <%# DataBinder.Eval(Container.DataItem, "prog_id") %>">:<%# DataBinder.Eval(Container.DataItem, "prog_name") %>
                <ul>
                    <li><%# DataBinder.Eval(Container.DataItem, "courses") %></li>
                </ul>
                </ItemTemplate>
        </asp:Repeater>

Код C#
protected void Page_Load(object sender, EventArgs e)
        {
string json="{\"root\":[{\"prog_id\":\"P1000004\",\"prog_name\":\"Course1\",\"prog_banner\":\"\",\"isClientActive\":\"\",\"courses\":[{\"course_id\":\"C1000012\",\"course_name\":\"Course1-1\",\"course_description\":\"\",\"course_thumbnail\":\"\"},{\"course_id\":\"C1000013\",\"course_name\":\"Course1-2\",\"course_description\":\"\",\"course_thumbnail\":\"\"}]},{\"prog_id\":\"P1000010\",\"prog_name\":\"Course2\",\"prog_banner\":\"1000010.jpg\",\"isClientActive\":\"active\",\"courses\":[{\"course_id\":\"C1000007\",\"course_name\":\"Course2-1\",\"course_description\":\"\",\"course_thumbnail\":\"\"},{\"course_id\":\"C1000008\",\"course_name\":\"Course2-2\",\"course_description\":\"\",\"course_thumbnail\":\"\"},{\"course_id\":\"C1000009\",\"course_name\":\"Course2-3\",\"course_description\":\"\",\"course_thumbnail\":\"\"},{\"course_id\":\"C1000010\",\"course_name\":\"Course2-4\",\"course_description\":\"\",\"course_thumbnail\":\"\"},{\"course_id\":\"C1000011\",\"course_name\":\"Course2-5\",\"course_description\":\"\",\"course_thumbnail\":\"\"}]}]}";

             Rootobject _objRoot = JsonConvert.DeserializeObject<Rootobject>(json);
             GetDataTableFromObjects(_objRoot.root);
             Repeater1.DataSource = GetDataTableFromObjects(_objRoot.root);
             Repeater1.DataBind();
        }
public static DataTable GetDataTableFromObjects(object[] objects)
        {
            if (objects != null && objects.Length > 0)
            {
                Type t = objects[0].GetType();
                DataTable dt = new DataTable(t.Name);
                foreach (PropertyInfo pi in t.GetProperties())
                {
                    dt.Columns.Add(new DataColumn(pi.Name));
                }
                foreach (var o in objects)
                {
                    DataRow dr = dt.NewRow();
                    foreach (DataColumn dc in dt.Columns)
                    {
                        dr[dc.ColumnName] = o.GetType().GetProperty(dc.ColumnName).GetValue(o, null);
                    }
                    dt.Rows.Add(dr);
                }
                return dt;
            }
            return null;
        }
    }

public class Rootobject
    {
        public Root[] root { get; set; }
    }

public class Root
    {
        public string prog_id { get; set; }
        public string prog_name { get; set; }
        public string prog_banner { get; set; }
        public string isClientActive { get; set; }
        public Cours[] courses { get; set; }
    }

public class Cours
    {
        public string course_id { get; set; }
        public string course_name { get; set; }
        public string course_description { get; set; }
        public string course_thumbnail { get; set; }
    }

MadMyche

В вашем вопросе отсутствует важная деталь: откуда берется JSON? Это AJAX-запрос? Или это исходит от запроса, сделанного на стороне сервера? Или это содержимое из файла?
Я бы посоветовал вам использовать Improve Question виджет выше, чтобы добавить это в исходный вопрос.

Member 8107173

Спасибо, Мадмыч, за ответ. Я обновил код и вопрос. Пожалуйста, пройдите через него и посмотрите, сможете ли вы помочь мне с этим. Я ценю вашу помощь.

MadMyche

всегда пожалуйста.
Это больше для пользы других, чтобы помочь вам; так как я не работаю с классом ретранслятора.
Когда вы отлаживаете это, правильно ли заполняются ваши классы при де-сериализации?

Member 8107173

да, он де-сериализуется, как и ожидалось. Я застрял только на уровне ретранслятора, где я не могу заполнить данные дочернего массива <%# DataBinder.Eval(Container.DataItem, "курсы") %>

1 Ответов

Рейтинг:
2

Richard Deeming

Не преобразовать объекты в DataTable; просто привяжите ретранслятор непосредственно к root коллекция.

Затем можно использовать вложенный ретранслятор для отображения связанных объектов.

Вы также должны убедиться, что значения закодированы в HTML-кодировке. Вы можете использовать <%#: ... %> вместо <%# ... %> сделать это. (Обратите внимание на дополнительные : после #.)

protected void Page_Load(object sender, EventArgs e)
{
    string json = ...;
    Rootobject _objRoot = JsonConvert.DeserializeObject<Rootobject>(json);
    Repeater1.DataSource = _objRoot.root;
    Repeater1.DataBind();
}
<asp:Repeater ID="Repeater1" runat="server" ModelType="YourNamespace.Root">
<ItemTemplate>
    <%#: Item.prog_id %>: <%#: Item.prog_name %>
    <ul>
        <asp:Repeater runat="server" ModelType="YourNamespace.Cours" DataSource='<% Item.courses %>'>
        <ItemTemplate>
            <li><%#: Item.course_name %></li>
        </ItemTemplate>
        </asp:Repeater>
    </ul>
</ItemTemplate>
</asp:Repeater>
Или, если вы не хотите указывать типы моделей:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
    <%#: Eval("prog_id") %>: <%#: Eval("prog_name") %>
    <ul>
        <asp:Repeater runat="server" DataSource='<% Eval("courses") %>'>
        <ItemTemplate>
            <li><%#: Eval("course_name") %></li>
        </ItemTemplate>
        </asp:Repeater>
    </ul>
</ItemTemplate>
</asp:Repeater>