ASP.NET的ImageLabel控件( 可能的编码器控制)

分享于 

5分钟阅读

Web开发

  繁體

示例图像- imagelabel.png

介绍

这是一个 ASP.NET web控件,用于将标签作为图像生成。 你可能希望为 E-mail 爬虫提供安全性,或者不允许复制文本的复制。 许多类似的控件已经作为HttpHandlers实现,因此需要更多的配置才能使它们工作。 但是,这里控件不需要任何配置。 你只需要像 Label 一样使用它,就像其他 ASP.NET 控件一样。 几乎所有的标签格式选项都包括在内,如字体大小。背景色和前景色。

它如何工作

代码可以分为两个部分: 变量初始化和渲染部分。 OnInit 事件用于准备要生成的图像的URL字符串。 URL字符串存储在类的private 成员中,以确保控件能够绘制自身。 这里有一个窍门。 这里控件由浏览器执行两次。 为了使工作正常,查询字符串的格式是预定义的。 浏览器尝试显示由标记指定的图像,init代码试图读取来自 QueryString 或者不生成图像的图像。

protectedoverridevoid OnInit(EventArgs e)
{ 
 if (this.Context.Request.QueryString[QueryStringText()]!= null)
 {
 DrawImage(this.Text);
 } 
 this.m_URL = Context.Request.Url.AbsolutePath + "?" + 
 secretQueryString+ this.ClientID + "=1";
 base.OnInit(e);
}

但是还有另一个问题。 由于浏览器执行两次,控制状态也不同,因这里存储显示文本值将不会使用视图。 因此,我将它存储在会话变量中,在呈现图像后清除。 控件的Text 属性处理会话和由设计器生成的自动代码。 你知道,在设计器中设置控件的文本后,编译后将由 ASP.NET 进程执行。 因为这个控件运行两个不同生命周期的控件,所以我说。 " this.Context.Request.QueryString [QueryStringText() ] ,确保我们来自主页面,而不是派生的控件。

publicstring Text
{
 get {
 if (DesignMode)
 {
 if (ViewState["Text"] == null)
 ViewState["Text"] = string.Empty;
 return (string)ViewState["Text"];
 }
 else {
 string s = PossiblequeryString();
 if (!string.IsNullOrEmpty(s))
 return (string)Context.Session[s]; 
 if (Context.Session[SessionText()] == null)
 Context.Session[SessionText()] = string.Empty;
 return (string)Context.Session[SessionText()];
 }
 }
 set {
 if (DesignMode)
 {
 ViewState["Text"] = value;
 }
 else {
 if (PossiblequeryString() == null)
 {
 Context.Session[SessionText()] = value;
 }
 }
 }
}

DrawImage 函数在内存中绘制图像并保存到 Response 对象。 由于 Response.End 方法被执行,因此在图像生成时不会再激发呈现事件。

strOutput.DrawString(Message, msgFont, new SolidBrush(foreColor), 1, 1);
MemoryStream memStream = new MemoryStream();
bmp.Save(memStream, System.Drawing.Imaging.ImageFormat.Png);
Context.Response.Clear();
Context.Response.ContentType = "image/png";
Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
memStream.WriteTo(Context.Response.OutputStream);
Context.Session.Remove(SessionText());
Context.Response.OutputStream.Flush();
Context.Response.OutputStream.Close();
Context.Response.End();

Render 代码用于图像的渲染。 它只是一个图像HTML标记,指向之前在 OnInit 上生成的URL。 为了让 Visual Studio 设计者高兴并停止抱怨异常,我还添加了代码,使它的成为设计器中正常的文本控件。

protectedoverridevoid Render(HtmlTextWriter writer)
{
 if (DesignMode)
 {
 base.Render(writer);
 }
 else {
 writer.AddAttribute(HtmlTextWriterAttribute.Src, this.m_URL);
 writer.RenderBeginTag(HtmlTextWriterTag.Img);
 writer.RenderEndTag();
 }
}

结束语

这里控件没有任何配置,并且很容易用作任何其他 ASP.NET 站点控件。 它可以用来隐藏爬虫或者机器人的信息。 虽然这不是作为CAPTCHA控件实现的,但是可以很容易地将该功能添加到映像生成。


控制  图像  asp  asp-net  cap  验证码