Нові елементи керування графіками asp.net - чи будуть вони працювати з MVC (з часом)?


74

Скотт Гу щойно опублікував інформацію про новий набір елементів керування графіками, які розповсюджує команда .NET. Вони виглядають неймовірно: http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt. aspx

Питання на мільйон доларів полягає в тому ... чи будуть вони працювати з MVC, і якщо так, то коли?

Відповіді:


94

Ви можете використовувати елементи керування діаграмою двома способами:

Генерування зображення з контролера

Створюючи діаграму та повертаючи її як зображення з дії (як, на мою думку, посилається на Чатумана):

Chart chart = new Chart();
chart.BackColor = Color.Transparent;
chart.Width = Unit.Pixel(250);
chart.Height = Unit.Pixel(100);

Series series1 = new Series("Series1");
series1.ChartArea = "ca1";
series1.ChartType = SeriesChartType.Pie;
series1.Font = new Font("Verdana", 8.25f, FontStyle.Regular);
series1.Points.Add(new DataPoint { 
                AxisLabel = "Value1", YValues = new double[] { value1 } });
series1.Points.Add(new DataPoint {
                AxisLabel = "Value2", YValues = new double[] { value2 } });
chart.Series.Add(series1);

ChartArea ca1 = new ChartArea("ca1");
ca1.BackColor = Color.Transparent;
chart.ChartAreas.Add(ca1);

using (var ms = new MemoryStream())
{
    chart.SaveImage(ms, ChartImageFormat.Png);
    ms.Seek(0, SeekOrigin.Begin);

    return File(ms.ToArray(), "image/png", "mychart.png");
}

Стиль веб-форм

Таким чином ви просто включаєте діаграму у свої подання .aspx (як і у традиційних веб-формах). Для цього вам доведеться підключити відповідні біти у вашому web.config

<controls>
    ...
    <add tagPrefix="asp"
         namespace="System.Web.UI.DataVisualization.Charting"
         assembly="System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>

<httpHandlers>
    ...
    <add path="ChartImg.axd"
         verb="GET,HEAD"
         validate="false"
         type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpHandlers>

<handlers>
    ...
    <add name="ChartImageHandler"
         preCondition="integratedMode" 
         verb="GET,HEAD"
         path="ChartImg.axd"
         type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</handlers>

Ви не можете запускати код всередині елементів DataPoint під час побудови діаграми, тому для підключення даних вам знадобиться метод у класі View. Для мене це нормально працює. Працюючи таким чином, елемент керування відображає URL-адресу до зображення, що генерується обробником http-діаграми. Під час розгортання вам потрібно буде надати папку для запису для кешування зображень.

* Підтримка VS 2010 / .NET 4 *

Щоб це працювало в .NET 4, вам потрібно змінити посилання на діаграми на версію 4.0.0.0 за допомогою відповідного маркера відкритого ключа.

Також здається, що елемент керування діаграмою тепер генерує URL-адреси до поточного шляху запиту, а не до маршруту запиту. Для мене це означало, що всі запити діаграми спричинили 404 помилки, оскільки /{Controller}/ChartImg.axdеквіваленти були заблоковані маршрутами. Щоб виправити це, я додав додаткові дзвінки IgnoreRoute, які охоплюють мої звички - було б більш загальним рішенням:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("ChartImg.axd/{*pathInfo}");
    routes.IgnoreRoute("{controller}/ChartImg.axd/{*pathInfo}");
    routes.IgnoreRoute("{controller}/{action}/ChartImg.axd/{*pathInfo}");
...

12
+1 - приємно. 2 невеликі зміни: MemoryStream ms = new MemoryStream()має бути в usingблоці, а контролер MVC має допоміжні методи повернення файлів - замість new FileStreamResultвас це можна зробитиreturn File(ms.ToArray(), "image/png", "mychart.png")
Кіт,

1
Додана інформація про те, як це працювати в .NET 4 - мені потрібні роки, щоб з’ясувати шляхи!
Саймон Стіл

4
Я щойно опублікував оновлену версію зразків діаграм для .net 4.0 у своєму блозі та додав 2 додаткові проекти - ChartsWithMVC та ChartsWithoutWebForms, які в основному відображають діаграму як зображення та повертають її. develocity.blogspot.com/2010/04/…
Дейв Хейнс

1
Чи є якийсь інший спосіб, щоб я міг використовувати діаграми Microsoft інтерактивну та підтримку Ajax? Я використовую MVC 4
kbvishnu

Додаткова інформація, яка може допомогти комусь: якщо ваші діаграми знаходяться в межах певної області, вам потрібно додати ігнорування (context.Routes.Ignore ("{controller} / {action} /ChartImg.axd / {* pathInfo}")) до RegisterArea метод теж
Фіона - myaccessible.website


2

Ви вже можете використовувати їх з MVC, все, що вам потрібно зробити, це зробити їх як зображення


1

Натомість зробіть Usercontrol і надайте йому повний об’єкт Chart, і нехай він робить це самостійно:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Web.UI.DataVisualization.Charting.Chart>" %>
<%
    Model.Page = this.Page;
    var writer = new HtmlTextWriter(Page.Response.Output);
    Model.RenderControl(writer);
%>

дайте йому ім'я Chart.ascx і помістіть у свою папку "Спільний вигляд".

тепер ви отримаєте весь зайвий html, наприклад карту зображень тощо, а також кешування.

у вашому контролері:

public ActionResult Chart(){
 var c = new Chart();
 //...
 return View(c);
}

у вашому поданні:

<% Html.RenderPartial("Chart", Model); %>

Я отримую низку помилок, яких я НІКОЛИ не бачив до використання цього методу, перша з яких Error executing child request for ChartImg.axd.- чи можете ви допомогти з цим?
Джимбо

Користувачі пропонували додати <add path="ChartImg.axd" verb="GET,HEAD" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false" />до web.config у <httpHandlers>розділі, однак це потім спричиняє ще одну помилку Session state has created a session id, but cannot save it because the response was already flushed by the application.- чи траплялося це також у вашій реалізації?
Джимбо,

використовувати .NET 4.0 або 3.5? якщо ви використовуєте 3.5, вам потрібно додати матеріали до web.config, як пропонує stackoverflow.com/questions/319835/… .
Карл Херберг,

якщо ви використовуєте .NET 4.0, додайте наступне: <system.webServer> <handlers> <add name = "ChartImageHandler" preCondition = "IntegratedMode" path = "ChartImg.axd" verb = "GET, HEAD" type = "System.Web .UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Версія = 4.0.0.0, Культура = нейтрально, PublicKeyToken = 31bf3856ad364e35 "/> </handlers> <system.webServer> і <app =" ChartHandHandler "value =" storage = файл; час очікування = 20; " /> </ appНалаштування, а також RouteIgnore запропоновані Саймоном Стілом
Карл Херберг

ТАК дякую Карлу! Працює у мене в MVC 4 та NET 4.5 VS2012. Простий спосіб генерувати елементи web.config - просто використовувати Провідник рішень, щоб додати новий елемент WebForm.aspx до проекту MVC 4; потім перетягніть із Панелі інструментів елемент керування діаграмою на поверхню дизайну aspx. І до App_Start / RouteConfig.cs додайте код, щоб ігнорувати маршрути, як показано Саймоном Стілом.
subsci

1

Ця стаття мені це найкраще вдалося:

http://www.codecapers.com/post/Build-a-Dashboard-With-Microsoft-Chart-Controls.aspx

Не видає помилок щодо "Об'єкт не встановлений як екземпляр об'єкта" або "Ідентифікатор сеансу був доступний, але потік відповідей очищений" (не точне формулювання помилок).

Я не хотів просто відображати їх як зображення, тому що якщо ви виконуєте деталізацію, підказки чи інші дії клацання на діаграмі, то візуалізація як зображення не зберігає нічого з цього.

Ключем для моїх потреб було помістити діаграму (-и) у модель, передати модель у вигляд (або частковий вигляд) та помістити панель asp: у вигляд та додати діаграму (-и) на панель у поданні розмітка.

До речі, це було з VS.net 2008 та MVC 2 3 вересня 2010 р. (Дати були якимись важливими при пошуку відповідей через зміни, які постійно відбуваються з MVC).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.