Как разделить список на представление в C#

#c# #asp.net #razor #chart.js

#c# #asp.net #razor #chart.js

Вопрос:

Я использую ChartJS для рисования диаграммы. Только разделенные значения могут быть обработаны для меток принятых значений и данных. Но в моем случае текст монолитный. В общем, я никак не могу отформатировать текст при передаче списка для просмотра.

Вид

 <script>
function chart1() {
    var ctx = document.getElementById('myChart');
    window.myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: [@foreach (var m in Model) { @m.NameArea}],
            datasets: [{
                    label: 'Районы',
                data: [@foreach (var m in Model) { @m.AreaParameter}],
                backgroundColor: [
                    'rgba(255, 99, 132, 0.2)'
                ],
                borderColor: [
                    'rgba(255, 99, 132, 1)'
                ],
                borderWidth: 1
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero: true
                    }
                }]
            }
        }
    });
};</script>
  

Контроллер

 public ActionResult Index()
{
    string connString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\database.mdf;Integrated Security=True";
    using (SqlConnection conn = new SqlConnection(connString))
    {
        List<Area> currentArea = new List<Area>();
        using (var cmd = new SqlCommand("SELECT NameArea, AreaParameter FROM FileTable", conn))
        {
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            if (reader.HasRows)
            {
                List<Area> dictList = new List<Area>();
                while (reader.Read())
                {
                    currentArea.Add(new Area()
                    {
                        //Id = Int32.Parse(reader["id"].ToString()),
                        NameArea = reader["NameArea"].ToString(),
                        AreaParameter = Int32.Parse(reader["AreaParameter"].ToString())
                    });
                }
            }
            conn.Close();
        }
        conn.Open();
        SqlCommand comDelete = new SqlCommand("DELETE FROM FileTable", conn);
        comDelete.ExecuteNonQuery();
        conn.Close();
        return View(currentArea);
    }
}
  

В результате скрипт получает список

 labels: [OneTwoThreeFour]
  

Я хотел бы видеть

 labels: ['One', 'Two', 'Three', 'Four']
  

Мне действительно нужна помощь.

Ответ №1:

Попробуйте отформатировать вывод. Должно сработать что-то вроде приведенного ниже.

 labels: @String.Join(",", Model.Select(x => $"'{x.NameArea}'"))
  

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

Надеюсь, это сработает для вас.

Комментарии:

1. в общем, я сделал почти то же самое, только намного хуже) labels: [@foreach (var m in Model) {@Html.Raw("'" String.Join("', '", m.NameArea) "', ")}] но все равно спасибо, это заставляет меня оптимизировать код.

2. Нет проблем. Если это работает, пожалуйста, отметьте это как ответ. Хорошего дня.