2008-11-26 30 views
74

Scott Gu vừa đăng về một bộ điều khiển biểu đồ mới được phân phối bởi nhóm .NET. Họ trông đáng kinh ngạc: http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspxĐiều khiển biểu đồ asp.net mới - liệu chúng có hoạt động với MVC (cuối cùng) không?

Câu hỏi triệu đô la là ... họ sẽ làm việc với MVC và nếu có thì khi nào?

Trả lời

94

Bạn có thể sử dụng điều khiển biểu đồ theo hai cách:

Tạo các hình ảnh từ một điều khiển

Bằng cách tạo biểu đồ và trả lại nó dưới dạng hình ảnh từ một hành động (như Chatuman đề cập đến tôi nghĩ):

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 Style

Bằng cách này bạn chỉ cần đưa biểu đồ vào dạng xem .aspx của bạn (giống như với biểu mẫu web truyền thống). Đối với điều này bạn sẽ phải treo lên các bit có liên quan trong web.config của bạn

<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> 

Bạn không thể chạy mã bên trong các yếu tố Datapoint khi xây dựng bảng xếp hạng, vì vậy để treo lên dữ liệu của bạn, bạn sẽ cần một trong lớp View. Điều này làm việc ok cho tôi. Làm việc theo cách này làm cho điều khiển hiển thị URL đến một hình ảnh được tạo bởi trình xử lý điều khiển biểu đồ http. Trong triển khai của bạn, bạn sẽ cần phải cung cấp một thư mục có thể ghi cho nó để lưu trữ hình ảnh.

* VS 2010/NET 4 Hỗ trợ *

Để làm việc này trong .NET 4 bạn cần thay đổi các tài liệu tham khảo biểu đồ lên phiên bản 4.0.0.0 với token khóa công khai thích hợp.

Ngoài ra có vẻ như điều khiển biểu đồ giờ đây tạo ra các url đến đường dẫn yêu cầu hiện tại thay vì đường yêu cầu. Đối với tôi, điều này có nghĩa là tất cả các yêu cầu biểu đồ dẫn đến lỗi 404 vì /{Controller}/ChartImg.axd và tương đương bị chặn bởi các tuyến đường. Để sửa lỗi này tôi đã thêm các cuộc gọi IgnoreRoute bổ sung mà bao gồm tập quán của tôi - một giải pháp tổng quát hơn sẽ tốt hơn:

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 - đẹp. 2 thay đổi nhỏ: 'MemoryStream ms = new MemoryStream()' phải nằm trong một khối 'using' và bộ điều khiển MVC có các phương thức trợ giúp để trả về các tệp - thay vì' new FileStreamResult' bạn có thể làm 'return File (ms.ToArray() , "image/png", "mychart.png") ' – Keith

+0

Cảm ơn @Keith, cả hai điểm tốt nên tôi đã cập nhật câu trả lời. –

+0

+1 cho câu trả lời hay. Cảm ơn đã dành thời gian. – gyurisc

2

Bạn đã có thể sử dụng chúng với MVC tất cả các bạn phải làm là làm cho họ như hình ảnh

0

Tôi đã được thử nghiệm với MVC và cho đến nay có vẻ như nó đang làm việc với MVC.

1

Thực hiện một UserControl thay vào đó và cung cấp cho nó đối tượng Chart đầy đủ và để cho nó làm cho nó tự:

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

tên nó Chart.ascx và đặt nó trong thư mục xem được chia sẻ của bạn.

bây giờ bạn sẽ nhận được tất cả html bổ sung, như bản đồ hình ảnh, v.v. miễn phí .. cũng như lưu vào bộ nhớ cache.

trong điều khiển của bạn:

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

trong View của bạn:

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

Im nhận được một số lỗi tôi chưa bao giờ thấy trước khi sử dụng phương pháp này, đầu tiên trong số đó là' Lỗi thực hiện yêu cầu con cho ChartImg.axd.' - bạn có thể giúp với điều này? – Jimbo

+0

Người dùng đề xuất thêm '' vào web.config trong phần '', tuy nhiên điều này sau đó gây ra lỗi khác 'Session state đã tạo id phiên, nhưng không thể lưu nó vì phản hồi đã được flushed bởi application.' - đã làm điều này xảy ra trong việc thực hiện của bạn? – Jimbo

+0

sử dụng .NET 4.0 hoặc 3.5? nếu bạn sử dụng 3.5, bạn phải thêm công cụ vào web.config dưới dạng http://stackoverflow.com/questions/319835/new-asp-net-charting-controls-will-they-work-with-mvc-eventually/320891 # 320891 gợi ý. –

1

Bài viết này đã làm việc nó ra tốt nhất cho tôi:

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

Không cung cấp cho các lỗi về 'Đối tượng không được đặt thành một phiên bản của một đối tượng' hoặc 'id phiên có sẵn nhưng luồng phản hồi đã được xóa sạch '(không phải từ ngữ chính xác của các lỗi).

Tôi không sẵn sàng chỉ hiển thị chúng dưới dạng hình ảnh bởi vì nếu bạn đang thực hiện các chi tiết hoặc chú giải công cụ hoặc các hành động nhấp chuột khác trên biểu đồ, thì hãy kết xuất dưới dạng hình ảnh không bảo tồn bất kỳ điều gì.

Chìa khóa cho nhu cầu của tôi là đặt (các) biểu đồ vào một mô hình, chuyển mô hình đến chế độ xem (hoặc xem một phần) và đặt một bảng điều khiển: trong chế độ xem và thêm biểu đồ vào bảng điều khiển trong đánh dấu chế độ xem.

Nhân tiện, điều này là với VS.net 2008 và MVC 2 vào ngày 3 tháng 9 năm 2010 (ngày là điều tôi thấy quan trọng khi tìm kiếm câu trả lời vì những thay đổi liên tục xảy ra với MVC).

Các vấn đề liên quan