Преобразовать Dictionary из контроллера в Array JS

161
24 сентября 2021, 06:30

В контроллере такой код:

[HttpGet]
        public IActionResult Get()
        {
            var titles = _context.Post.Skip(Math.Max(0, _context.Post.Count() - 3));
            Dictionary<int, string> icons = new Dictionary<int, string>
            {
                {1, "https://psv4.userapi.com/c856216/u255728013/docs/d4/25a0121ef7e0/icons8-patreon-24.png?extra=iIg5FaXfLQhNTl2Tis4nHFwBNf8axTD_FzWCXXoE5SUkcnUYQw_y0e89lG_jKelKLPLyMPezCAOrlpowROFLbqWs9d5tADacKUpT2XJIn1o9Z1j-ngQ2I2a-eWM8R4b2jueZnSxsWedLgQpiN1OcjbRBWg" },
                {2, "https://psv4.userapi.com/c856528/u255728013/docs/d14/452cd2130b88/blog.svg?extra=6rkAwH-8jQYkHEfJcYuRo34NcBA1ydm_DkggZrbs3pG9Y_Lgcd7BmLYB_xJHx2_qHUS-I_2v8YitH5I3_JnNk0RizKCzKg3NwcDzWkH_kX2RDoIB7dDqUjxt1MzFIFRI-t4DJfaKBAJlUI7sfj07TFO37Q&dl=1"},
                {3, "https://psv4.userapi.com/c856216/u255728013/docs/d4/25a0121ef7e0/icons8-patreon-24.png?extra=iIg5FaXfLQhNTl2Tis4nHFwBNf8axTD_FzWCXXoE5SUkcnUYQw_y0e89lG_jKelKLPLyMPezCAOrlpowROFLbqWs9d5tADacKUpT2XJIn1o9Z1j-ngQ2I2a-eWM8R4b2jueZnSxsWedLgQpiN1OcjbRBWg" }
            };
            List<PostsPayload> articles = new List<PostsPayload>();
            foreach (var title in titles)
            {
                articles.Add(new PostsPayload
                {
                    IconUrl = icons[title.ResourceId],
                    AtricleBody = title.Title
                }) ;
            }
            return Json(articles.ToArray());
        }

В классе React js этот код:

export class BlockBuilder extends Component {
    constructor(props) {
        super(props);
        this.state = { blocktitle: "", data: [] };        
    }
    componentDidMount() {
        this.fetchData();
    }
    async fetchData() {
        const response = await fetch('api/article');
        const data = await response.json();
        this.setState({ blocktitle: this.props.blocktitle, data: data });
    }
    render() {
        return (
            <React.Fragment>
                <div className="newsblock_blockHead">
                    <div className="blockText">{this.state.blocktitle}</div></div>
                <div className="newsblock_body pr-0">
                    <ArticleBuilder data={this.state.data} />
                </div>
            </React.Fragment>
        );
    }
}
class ArticleBuilder extends Component {
    constructor(props) {
        super(props);
        this.state = {
            data: []
        };
        this.setState = { data: this.props.data };
    }
    render() {
        var links = [];
        for (var i = 0; i < this.props.data.length; i++) {
            var item = this.props.data[i];
            links.push(
                <div className="article" key={i}>
                    <img src={item.IconUrl} className="article_image" />
                    <p className="paragraph">
                        <a href={"#"}>{item.ArticleBody}</a>
                    </p>
                </div>
            );
        }
        return (
            <React.Fragment>
                {links}
            </React.Fragment>
        );
    }
}

Response


    [{"iconUrl":"https://psv4.userapi.com/c856216/u255728013/docs/d4/25a0121ef7e0/icons8-patreon-24.png?extra=iIg5FaXfLQhNTl2Tis4nHFwBNf8axTD_FzWCXXoE5SUkcnUYQw_y0e89lG_jKelKLPLyMPezCAOrlpowROFLbqWs9d5tADacKUpT2XJIn1o9Z1j-ngQ2I2a-eWM8R4b2jueZnSxsWedLgQpiN1OcjbRBWg","atricleBody":"October\u0027s project 2B Nier Automata RE!"},{"iconUrl":"https://psv4.userapi.com/c856216/u255728013/docs/d4/25a0121ef7e0/icons8-patreon-24.png?extra=iIg5FaXfLQhNTl2Tis4nHFwBNf8axTD_FzWCXXoE5SUkcnUYQw_y0e89lG_jKelKLPLyMPezCAOrlpowROFLbqWs9d5tADacKUpT2XJIn1o9Z1j-ngQ2I2a-eWM8R4b2jueZnSxsWedLgQpiN1OcjbRBWg","atricleBody":"September phone wallpaper #2 [Hidden treasure pt. 2]"},{"iconUrl":"https://psv4.userapi.com/c856528/u255728013/docs/d14/452cd2130b88/blog.svg?extra=6rkAwH-8jQYkHEfJcYuRo34NcBA1ydm_DkggZrbs3pG9Y_Lgcd7BmLYB_xJHx2_qHUS-I_2v8YitH5I3_JnNk0RizKCzKg3NwcDzWkH_kX2RDoIB7dDqUjxt1MzFIFRI-t4DJfaKBAJlUI7sfj07TFO37Q\u0026dl=1","atricleBody":"Vacation time! Interesting stories inside!"}]

Идея такая: из БД вытащить titles, сопоставить с нужными иконками и вернуть в массив KeyValue в js коде, а затем занести его в state. Потом сделать map и вернуть элементы. Не понимаю, почему не срабатывает правильно фетч, пробовал возвращать и просто Dictionary, и JsonConvert.Seralize(articles), но всё равно ошибки. Во вкладке Network браузера нашел запрос к article, но там в response вообще идет html-код index.html почему-то.

UPD: сейчас дошёл хотя бы до того, что получаю нормальный ответ с сервера виде json, однако элементы все равно не отображаются. Что я делаю не так? В links хранится три Object с IconUrl и ArticleBody, если что. PostsPayload - модель, в которой есть одноименные свойства

Answer 1

По итогу проблема чрезвычайно глупая. После редактирования кода все почти получилось, но не работало. А не работало потому что не учел, что при конвертации в Json, названия превращаются в camelCase, судя по всему И была опечатка в ArticleBody

Прошу прощения за глупость такую

READ ALSO
Проверка наличия класса

Проверка наличия класса

Есть код "корзины", как можно сделать проверку наличия класса, если класс уже есть, то вместо добавления нового блока увеличивать значение...

109
Не работает CSS В HTML файле

Не работает CSS В HTML файле

Такая проблема, у меня не работает css файл на локальном сервере, в коде вроде ошибок нету, вчера все работалоPS Тут вставленный код отлично...

139
Как можно переписать рекурсивный поиск количества вершин в дереве?

Как можно переписать рекурсивный поиск количества вершин в дереве?

> Максимальное число вершин дерева в цепочке, начинающейся в корне дерева, заканчивающейся в одном из его листьев, и не содержащей никакую...

107
Для каждого слова заданного текста указать долю согласных. Определить слово, в котором доля согласных максимальна

Для каждого слова заданного текста указать долю согласных. Определить слово, в котором доля согласных максимальна

Для каждого слова заданного текста указать долю согласныхОпределить слово, в котором доля согласных максимальна

141