Я новичок в создании пользовательского элемента управления ASP.NET, который будет отображать и возвращать диаграммы .png в веб-приложение ASP.NET.Как обращаться с обработчиком HTTP из UserControl
Я создал простой проект песочницы, который создает эллипс на растровом изображении, превращает его в MemoryStream, и теперь я хочу передать результат, связанный через обработчик HTTP, чтобы отобразить asp: image в моей разметке стр.
Моя проблема заключается в том, что я не знаю, как подключить MemoryStream, созданный в моем usercontrol, к методу GetImage обработчика http. Я знаю, что GetMethod обработчика HTTP, создающего поток памяти внутри метода, неверен, но я не знаю, как получить доступ к запоминающему потоку кода.
Мой прототип код тестового проекта является:
namespace ChartControl
{
public partial class ChartCtl : System.Web.UI.UserControl
{
private int imageHeight = 150;
private int imageWidth = 400;
protected void Page_Load(object sender, EventArgs e)
{
renderChart();
}
protected MemoryStream renderChart()
{
Image imgChart = new Bitmap(imageWidth, imageHeight);
Graphics g = Graphics.FromImage(imgChart);
Rectangle r = new Rectangle(0, 0, imageWidth, imageHeight);
g.DrawEllipse(Pens.Orange, g.VisibleClipBounds);
MemoryStream ms = new MemoryStream();
imgChart.Save(ms, ImageFormat.Png);
return ms;
}
}
}
Мой HTTP Handler является:
namespace WIChart.UserControls
{
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
{
int id = Int32.Parse(context.Request.QueryString["id"]);
// Now we have the id, just pass it to GetImage to build the image
Image image = GetImage(id);
context.Response.ContentType = "image/png";
image.Save(context.Response.OutputStream, ImageFormat.Png);
}
else
{
context.Response.ContentType = "text/html";
context.Response.Write("<p>Valid id is required.</p>");
}
}
#region IHttpHandler Members
public bool IsReusable
{
get { return false; }
}
private Image GetImage(int id)
{
MemoryStream stream = new MemoryStream();
return Image.FromStream(stream);
}
#endregion
}
}
Моя страница .ascx является:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ChartCtl.ascx.cs" Inherits="ChartControl.ChartCtl" %>
<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>
<div class="content-wrapper">
<div class="float-left">
<p class="site-title">
<asp:Image id="imgChart" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" />
</p>
</div>
</div>
Спасибо за любую помощь, которую вам может обеспечить!
IDE жалуется на 8-ю строчку в коде с красным squiggly под LoadControl и ResolveClientURL с сообщениями, что «Имя« LoadControl »не существует в текущем контексте» и «Имя« ResolveClientURL »не существует в текущий контекст ". – PaulPerkins
@PaulPerkins - я изменил код. Пожалуйста, проверь это. Нам нужно наследовать «Страница» для LoadControl() и ResolveClientURL(). – mlg
спасибо. Я пробовал ваш код, но renderChart никогда не достигается в коде. У вас есть идеи, почему? Еще раз спасибо за ваш опыт в решении этой проблемы! – PaulPerkins