MVC3 Chart Helper с данными в качестве параметра - PullRequest
2 голосов
/ 21 сентября 2011

Я имею дело с помощником диаграмм в mvc framework и мне интересно, есть ли способ добавить динамические данные в диаграмму. все учебные пособия (например, http://www.asp.net/webmatrix/tutorials/7-displaying-data-in-a-chart) используют жестко закодированные данные.

Что делать, если я хочу передать данные, например, список акций и отобразить данные на графиках.

Я включаю график с:

 <img src="@Url.Action("GenerateChart", new {data = stocks})" alt="stocks" />

Возможный код метода действия:

 public FileContentResult GenerateChartImage(IList<StockProgressionModel> data)
    {
        Chart chart = new Chart(800, 600);

        foreach (var stock in data {

            int[] xArray = Enumerable.Range(0, stock.Entries.Count).ToArray();
            var yArray = stock.Entries.Select(e => e.Value).ToArray();

            chart.AddSeries(ap.FieldOfActivityName, chartType: "FastLine",
                            xValue: xArray,
                            yValues: yArray);
            chart.SetXAxis("Month", 0);
            chart.SetYAxis("Value", 0);
        }

        return File(chart.GetBytes(), "image/png");
    }

Это означает, что ссылка на URL всегда одна и та же, и я не могу передать данные в качестве параметра. Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Я нашел решение:

Просмотр:

@{
    string key = Guid.NewGuid().ToString();
    @Html.Action("GenerateChart", new { @cacheKey = key, data = stocks })
    string url = Url.Action("ShowChart", new { @cacheKey = key });
    <img src="@url" alt="Chart" />
}

Контроллер:

public void GenerateChartImage(IList<StockProgressionModel> data)
{
    Chart chart = new Chart(800, 600);

    foreach (var stock in data {

        int[] xArray = Enumerable.Range(0, stock.Entries.Count).ToArray();
        var yArray = stock.Entries.Select(e => e.Value).ToArray();

        chart.AddSeries(ap.FieldOfActivityName, chartType: "FastLine",
                        xValue: xArray,
                        yValues: yArray);
        chart.SetXAxis("Month", 0);
        chart.SetYAxis("Value", 0);
    }
    chart.SaveToCache(cacheKey, 1);
}

public void ShowChart(string cacheKey)
{
    Chart chart = Chart.GetFromCache(cacheKey);
    chart.Write("jpeg");
}

Если бы у кого-то было лучшее решение, мне было бы интересно.

0 голосов
/ 21 февраля 2017

Вы можете запросить данные в вашем контроллере и передать их для просмотра

    public ActionResult Index()
    {
        string cs = System.Configuration.ConfigurationManager.ConnectionStrings["DevelopmentConnectionString"].ConnectionString;
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(cs);
        var currentYear = DateTime.Now.Year;
            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand($"SELECT top 5 product, itemUnitPrice FROM [Development].[dbo].[Orderslist] WHERE timeStamp LIKE '%{currentYear}%' GROUP BY itemUnitPrice, product order by COUNT(product) desc", con);
            con.Open();
            System.Data.SqlClient.SqlDataReader rdr = cmd.ExecuteReader();
            ViewBag.data = rdr;


        return View();
    }

И затем вы можете использовать

.DataBindTable(ViewBag.data, xField: "product").Write()

...