ElenaRez Ответов: 1

Как передать список элементов типа list из контроллера в представление


Привет. У меня есть несколько запросов, которые имеют некоторые выходы в своей избранной части. Теперь я хочу отправить эти запросы выходы из контроллера в поле зрения но есть ошибка при отправке их следующим образом:

Исключение InvalidOperationException: элемент модели, переданный в экземпляр класса viewdatadictionary имеет тип System.Коллекции.Generic.List`1[Приборная Панель.Модели.ChartModel]', но для этого экземпляра ViewDataDictionary требуется элемент модели типа 'System.Коллекции.Generic.List`1[Приборная Панель.Темпклассы.ChartListObjects]'.

например, один из моих запросов называется avg, и чтобы получить его данные, в контроллере есть часть моего кода, подобная следующей:
часть моего кода контроллера
{

namespace Dashboard.Controllers
{
    public class HomeController : Controller
    {
    //    private readonly ILogger<HomeController> _logger;
        private readonly CSSDDashboardContext _context;
        public HomeController(DashboardContext context)
        {
            _context = context;
        }
     public IActionResult Index()  
    {
    var lstModel = new List<ChartModel>();

    var vm = new List<ChartListObjects>();
     foreach (var index in avg)
                {
                    lstModel.Add(new ChartModel
                    {
                        DimensionOne = index.Month,
                        Quantity = (int)index.Avg
                    });
                }
                vm.GrantedAvg = lstModel;

foreach (var index in grantedAccessPercent)
            {
                lstModel1.Add(new ChartModel
                {
                    DimensionOne = MonthName(index.Month),
                    Quantity = (int)index.pct
                });
            }
     vm.GrantedPercent = lstModel1;
    return view(vm);
    }
}




Вот мой класс ChartModel

namespace Dashboard.Models
{
    public class ChartModel
    {
        public int Quantity { get; set; }
        public string DimensionOne { get; set; }
    }
}


Вот мой класс ChartListObjects:

namespace Dashboard.TempClasses
{
    public class ChartListObjects
    {
        public List<ChartModel> GrantedPercent { get; set; }
        public List<ChartModel> AvgPercent { get; set; }

  }
}


Я не могу понять, в чем проблема, я ценю любую помощь. Спасибо.

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

namespace Dashboard.Models
{
    public class ChartModel
    {
        public int Quantity { get; set; }
        public string DimensionOne { get; set; }
    }
}



И вот моя часть зрения:

@using System.Linq;


@model List<Dashboard.TempClasses.ChartListObjects>
@{
    var XLabels = Newtonsoft.Json.JsonConvert.SerializeObject(Model.Select(x => x.GrantedPercent.FirstOrDefault().DimensionOne).ToList());
    var YValues = Newtonsoft.Json.JsonConvert.SerializeObject(Model.Select(x => x.GrantedPercent.FirstOrDefault().Quantity).ToList());
    ViewData["Title"] = "Pie Chart";
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Pie</title>
</head>
<body>
    <div class="box-body">

        <div class="chart-container">
            <canvas id="chart" style="width:100%; height:500px"></canvas>
        </div>
    </div>
</body>
</html>

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<script type="text/javascript">

                $(function () {
            var chartName = "chart";
                var ctx = document.getElementById(chartName).getContext('2d');
                var data = {
                        labels: @Html.Raw(XLabels),
                        datasets: [{
                            label: "Drinks Chart",
                            backgroundColor: [
                                'rgba(255, 99, 132, 0.2)',
                                'rgba(54, 162, 235, 0.2)',
                                'rgba(255, 206, 86, 0.2)',
                                'rgba(75, 192, 192, 0.2)',
                                'rgba(153, 102, 255, 0.2)',
                                'rgba(255, 159, 64, 0.2)',
                                'rgba(255, 0, 0)',
                                'rgba(0, 255, 0)',
                                'rgba(0, 0, 255)',
                                'rgba(192, 192, 192)',
                                'rgba(255, 255, 0)',
                                'rgba(255, 0, 255)'
                            ],
                            borderColor: [
                                'rgba(255,99,132,1)',
                                'rgba(54, 162, 235, 1)',
                                'rgba(255, 206, 86, 1)',
                                'rgba(75, 192, 192, 1)',
                                'rgba(153, 102, 255, 1)',
                                'rgba(255, 159, 64, 1)',
                                'rgba(255, 0, 0)',
                                'rgba(0, 255, 0)',
                                'rgba(0, 0, 255)',
                                'rgba(192, 192, 192)',
                                'rgba(255, 255, 0)',
                                'rgba(255, 0, 255)'
                            ],
                            borderWidth: 1,
                            data: @Html.Raw(YValues)
            }]
                    };

        var options = {
                        maintainAspectRatio: false,
                        scales: {
                            yAxes: [{
                                ticks: {
                                    min: 0,
                                    beginAtZero: true
                                },
                                gridLines: {
                                    display: true,
                                    color: "rgba(255,99,164,0.2)"
                                }
        }],
                            xAxes: [{
                                ticks: {
                                    min: 0,
                                    beginAtZero: true
                                },
                                gridLines: {
                                    display: false
                                }
                            }]
                        }
                    };

               var myChart = new  Chart(ctx, {
                        options: options,
                        data: data,
                        type:'pie'

                    });
                });
</script>

1 Ответов

Рейтинг:
6

Richard Deeming

Цитата:
Элемент модели, переданный в ViewDataDictionary, имеет тип List<ChartModel>, но этот экземпляр экземпляр класса viewdatadictionary предполагает модель элемента типа List<ChartListObjects>.
Ошибка вполне очевидна - ваш взгляд ожидает, что модель будет представлять собой список ChartListObjects, но вы прошли в список ChartModel объекты.

Это, кажется, не соответствует коду, который вы показали. Либо код, который вы запускаете, не является тем кодом, который вы показали, либо где-то в вашем представлении вы визуализируете частичное представление (с помощью Html.Partial помощник, или тот самый <partial> помощник по тегам) и вы передаете неверное значение его модели.

Однако это немного сбивает с толку: ваше действие использует ChartListObject, в то время как ваше представление и Ваше объявление класса используют ChartListObjects Это два разных названия классов. Я не знаю, является ли это опечаткой в вашем коде, которая вызывает ошибку сборки, или опечаткой в вашем вопросе.


ElenaRez

Спасибо за вашу помощь. Я хочу, чтобы в представлении razor был список Картмоделей, но я не знаю, как это исправить. Может быть, даже класс ChartListObjects бесполезен. Или, может быть, мне нужно знать, как получить эти модели карт в поле зрения

Richard Deeming

Если вы хотите, чтобы модель представления была List<ChartModel>, почему вы объявили его как List<ChartListObjects>? И почему вы проходите мимо List<ChartListObject> (без буквы "С") от вашего действия?

ElenaRez

Спасибо. Если вы предполагаете, что grantedAccessPercent и Avg-это два запроса, и я добавляю их данные в lstModel1 и lstModel соответственно, то это все виды ChartModel. Как я могу интегрировать их в объект и передать их из индексного метода контроллера в поле зрения?

Richard Deeming

Вы создаете класс, представляющий данные, которые вы хотите передать в представление. Вы устанавливаете вид @model чтобы соответствовать этому классу. Затем вы передаете экземпляр этого класса в View метод.

Напр.:

public IActionResult Index()  
{
    var vm = new ChartListObjects
    {
        GrantedPercent = new List<ChartModel>(),
        AvgPercent = new List<ChartModel>(),
    };

    foreach (var index in avg)
    {
        vm.AvgPercent.Add(new ChartModel
        {
            DimensionOne = index.Month,
            Quantity = (int)index.Avg
        });
    }
    
    foreach (var index in grantedAccessPercent)
    {
        vm.GrantedPercent.Add(new ChartModel
        {
            DimensionOne = MonthName(index.Month),
            Quantity = (int)index.pct
        });
    }
    
    return View(vm);
}
Смотреть:
@model Dashboard.TempClasses.ChartListObjects
...

ElenaRez

Спасибо за вашу помощь. Но тогда как я могу получить значение ChartListObjects? Я написал что-то вроде ниже, но есть ошибка для DimensionOne и Quantity part, например: 'List<chartmodel>' Не содержит определения для 'Quantity' и не может быть найден доступный метод расширения 'Quantity', принимающий первый аргумент типа 'List<chartmodel>' (вы пропускаете директиву using или ссылку на сборку?'

ВАР XLabels = Newtonsoft.В формате JSON.JsonConvert.SerializeObject(Модель.GrantedApiToApplicantAvg.DimensionOne).Список();
var YValues = Newtonsoft.Json.JsonConvert.SerializeObject(Модель.GrantedApiToApplicantAvg.Количество).Список();

Richard Deeming

Попробуй:

var XLabels = Newtonsoft.Json.JsonConvert.SerializeObject(Model.GrantedApiToApplicantAvg.Select(i => i.DimensionOne).ToList());
var YValues = Newtonsoft.Json.JsonConvert.SerializeObject(Model.GrantedApiToApplicantAvg.Select(i => i.Quantity).ToList());