2008-11-26 15 views

Odpowiedz

94

Można używać formantów wykres na dwa sposoby:

Generowanie obrazu z kontrolerem

Generując wykres i zwracając go jako obraz z działania (jak mówi Chatuman, myślę):

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"); 
} 

WebForms Styl

W ten sposób wystarczy dołączyć wykres do swoich widoków .aspx (podobnie jak w przypadku tradycyjnych formularzy internetowych). W tym celu będziesz musiał podłączyć odpowiednie bity w 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> 

Nie można uruchomić kod wewnątrz elementów DATAPOINT podczas budowania wykresu, tak aby podłączyć swoje dane musisz mieć metoda w klasie Widok. To działa dobrze dla mnie. Działanie w ten sposób sprawia, że ​​formant renderuje adres URL do obrazu wygenerowanego przez program obsługi http kontrolera wykresu. We wdrożeniu musisz udostępnić zapisywalny folder, aby buforował obrazy.

* VS/.NET 4 Pomoc 2010 *

Aby uzyskać tej pracy w .NET 4, czego potrzeba, aby zmienić referencje wykresu wersji 4.0.0.0 z odpowiednim kluczem publicznym tokena.

Wygląda na to, że kontrolka wykresu generuje teraz adresy URL do bieżącej ścieżki żądania, a nie do trasy żądania. Dla mnie oznaczało to, że wszystkie żądania wykresów spowodowały błędy 404, ponieważ /{Controller}/ChartImg.axd i ich odpowiedniki były blokowane przez trasy. Do tego dodałem dodatkowe połączenia IgnoreRoute które pokrywają swoje zwyczaje naprawić - bardziej ogólne rozwiązanie byłoby lepsze:

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 - Nicea. 2 małe zmiany: 'MemoryStream ms = new MemoryStream()' powinien znajdować się w bloku 'using', a kontroler MVC ma pomocnicze metody zwracania plików - zamiast' new FileStreamResult' możesz zrobić 'return File (ms.ToArray() , "image/png", "mychart.png") ' – Keith

+0

Dzięki @Keith, oba dobre punkty, więc zaktualizowałem odpowiedź. –

+0

+1 za dobrą odpowiedź. Dzięki za poświęcenie czasu. – gyurisc

2

już można z nich korzystać z MVC Wszystko co musisz zrobić, to uznać je jako obrazy

0

I zostały badania z MVC i do tej pory wygląda to działa z MVC.

1

Zrób UserControl zamiast i nadać mu pełną obiektu Chart i niech to czynią to samo:

<%@ 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); 
%> 

name it Chart.ascx i umieścić go w folderu udostępnionego widoku.

teraz otrzymasz wszystkie dodatkowe html, np. Mapę obrazu itp. Za darmo .., a także buforowanie.

w kontrolerze:

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

w widoku:

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

Otrzymuję wiele błędów, których NIGDY nie widziałem przed użyciem tej metody, z których pierwszym jest" Błąd wykonywania żądania dziecka dla ChartImg.axd. - możesz pomóc w tym? – Jimbo

+0

Użytkownicy sugerowali dodanie '' do web.config w sekcji '', jednak powoduje to kolejny błąd 'Sesja stan utworzył identyfikator sesji, ale nie może go zapisać, ponieważ odpowiedź był już spłukany przez aplikację. "- Czy to też miało miejsce w twojej implementacji? – Jimbo

+0

używać programu .NET 4.0 lub 3.5? jeśli używasz 3.5, musisz dodać rzeczy do web.config jako http://stackoverflow.com/questions/319835/new-asp-net-charting-controls-will-theywork-with-mvc-eventually/320891 # 320891 sugeruje. –

1

Ten artykuł pracował go najlepiej dla mnie:

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

nie daje błędy dotyczące "Obiekt nie ustawiony na instancję obiektu" lub "ID sesji" był dostępny, ale strumień odpowiedzi został przepłukany "(a nie dokładne sformułowanie błędów).

Nie chciałem po prostu renderować ich jako obrazu, ponieważ jeśli robisz drążenia w dół lub podpowiedzi narzędzi lub inne akcje kliknięcia na wykresie, renderowanie jako obrazu nie zachowuje tego.

Kluczem do moich potrzeb było umieszczenie wykresu (ów) w modelu, przekazanie modelu do widoku (lub widoku częściowego) i umieszczenie panelu asp: w widoku i dodanie wykresów do panel w widoku znaczników.

Nawiasem mówiąc, było to w przypadku VS.net 2008 i MVC 2 3 września 2010 r. (Daty były czymś, co uznałem za ważne przy wyszukiwaniu odpowiedzi ze względu na zmiany, które ciągle następują w MVC).