📄 htmleditor.cs
字号:
using System;
using System.Web;
using System.Web.UI;
using System.Collections;
using System.Xml;
using System.Drawing;
using System.Web.UI.WebControls;
using System.ComponentModel;
using Lion.Data.Library.HtmlEditor.Core;
using Lion.Data.Library.HtmlEditor.License;
namespace Lion.Data.Library.HtmlEditor
{
/// <summary>
/// 专用于 ASP.Net 的Web编辑器
/// </summary>
[DefaultProperty("Text"),
DefaultEvent("TextChanged"),
PersistChildren(false),
Description("专用于 ASP.Net 的Web编辑器"),
Designer(typeof(HtmlEditorDesigner)),
ToolboxData("<{0}:HtmlEditor runat=server></{0}:HtmlEditor>"),
LicenseProviderAttribute(typeof(MyLicenseProvider))]
public class HtmlEditor : System.Web.UI.WebControls.WebControl
{
#region License
private System.ComponentModel.License _license = null;
/// <summary>
/// 实例化 <see cref="HtmlEditor"/>
/// </summary>
public HtmlEditor()
{
_license = LicenseManager.Validate(typeof(HtmlEditor), this);
}
#endregion
#region Other
/// <summary>
/// <see cref="HtmlEditor"/> 的配置文件目录,默认配置文件默认放置在:/lionsky_client/Lion.Data.Library.HtmlEditor.x/目录下面
/// </summary>
[Browsable(true),
Category("外观"),
DefaultValue(false),
Description("是否使用配置文件,默认配置文件放置在:/lionsky_client/Lion.Data.Library.HtmlEditor.x/目录下面")]
public string ConfigFile
{
get
{
object obj=ViewState["ConfigFile"];
return (obj==null)?null:(((string)obj).Trim()==String.Empty?null:(string)obj);
}
set
{
ViewState["ConfigFile"]=value;
}
}
/// <summary>
/// <see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值
/// </summary>
[Browsable(true),
Description("Text值"),
Category("外观"),
DefaultValue(null)]
public string Text
{
get
{
object obj=ViewState["Text"];
return (obj==null)?String.Empty:(string)obj;
}
set
{
ViewState["Text"]=value;
}
}
/// <summary>
/// 保存上传文件成功返回原文件名[如:Logo.gif]的控件ID
/// </summary>
[Browsable(true),
Category("杂项"),
DefaultValue(false),
Description("保存上传文件成功返回原文件名[如:Logo.gif]的控件ID")]
public string OriginalFileName
{
get
{
object obj=ViewState["OriginalFileName"];
return (obj==null)?null:(((string)obj).Trim()==String.Empty?null:(string)obj);
}
set
{
ViewState["OriginalFileName"]=value;
}
}
/// <summary>
/// 保存上传文件成功后的随机文件名[如:200406082044129049.gif]的控件ID
/// </summary>
[Browsable(true),
Category("杂项"),
DefaultValue(false),
Description("保存上传文件成功后的随机文件名[如:200406082044129049.gif]的控件ID")]
public string SaveFileName
{
get
{
object obj=ViewState["SaveFileName"];
return (obj==null)?null:(((string)obj).Trim()==String.Empty?null:(string)obj);
}
set
{
ViewState["SaveFileName"]=value;
}
}
/// <summary>
/// 保存上传文件成功后的路径文件名[如:/UploadFile/200406082044129049.gif]的控件ID
/// </summary>
[Browsable(true),
Category("杂项"),
DefaultValue(false),
Description("保存上传文件成功后的路径文件名[如:/UploadFile/200406082044129049.gif]的控件ID")]
public string SavePathFileName
{
get
{
object obj=ViewState["SavePathFileName"];
return (obj==null)?null:(((string)obj).Trim()==String.Empty?null:(string)obj);
}
set
{
ViewState["SavePathFileName"]=value;
}
}
#region 行为
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用javascript,vbscript等,事件onclick,ondlbclick等
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用javascript,vbscript等,事件onclick,ondlbclick等"),
Category("行为"),
DefaultValue(false)]
public bool Scriptfilter
{
get
{
object obj=ViewState["Scriptfilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["Scriptfilter"]=value;
}
}
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用table,th,td,tr标签
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用table,th,td,tr标签"),
Category("行为"),
DefaultValue(false)]
public bool Tablefilter
{
get
{
object obj=ViewState["Tablefilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["Tablefilter"]=value;
}
}
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用class= 这样的标签
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用class= 这样的标签"),
Category("行为"),
DefaultValue(false)]
public bool Classfilter
{
get
{
object obj=ViewState["Classfilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["Classfilter"]=value;
}
}
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用style= 这样的标签
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用style= 这样的标签"),
Category("行为"),
DefaultValue(false)]
public bool Stylefilter
{
get
{
object obj=ViewState["Stylefilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["Stylefilter"]=value;
}
}
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用xml 标签
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用xml 标签"),
Category("行为"),
DefaultValue(false)]
public bool XMLfilter
{
get
{
object obj=ViewState["XMLfilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["XMLfilter"]=value;
}
}
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用<o:p></o:p> 这种格式
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用<o:p></o:p> 这种格式"),
Category("行为"),
DefaultValue(false)]
public bool NAMESPACEfilter
{
get
{
object obj=ViewState["NAMESPACEfilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["NAMESPACEfilter"]=value;
}
}
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用font 标签,不建议使用
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用font 标签,不建议使用"),
Category("行为"),
DefaultValue(false)]
public bool Fontfilter
{
get
{
object obj=ViewState["Fontfilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["Fontfilter"]=value;
}
}
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用marquee 标签,也就没有移动滚动的特殊
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用marquee 标签,也就没有移动滚动的特殊"),
Category("行为"),
DefaultValue(false)]
public bool Marqueefilter
{
get
{
object obj=ViewState["Marqueefilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["Marqueefilter"]=value;
}
}
/// <summary>
/// 是否允许<see cref="Lion.Data.Library.HtmlEditor.HtmlEditor"/> 的Text值使用bject, param, embed 标签,不能嵌入对象
/// </summary>
[Browsable(true),
Description("是否允许 HtmlEditor 的Text值使用bject, param, embed 标签,不能嵌入对象"),
Category("行为"),
DefaultValue(false)]
public bool OBJECTfilter
{
get
{
object obj=ViewState["OBJECTfilter"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["OBJECTfilter"]=value;
}
}
#endregion
/// <summary>
/// 获取或设置一个值,该值指示 HtmlEditor 服务器控件是否向发出请求的客户端保持自己的视图状态,该属性经重写后不允许设为false。
/// </summary>
/// <remarks><see cref="HtmlEditor"/> 服务器控件将一些重要的信息保存在ViewState中
/// <p><note>该属性并不能禁止用户用<![CDATA[<%@Page EnableViewState=false%> ]]>页指令来禁用整个页面的视图状态。</note></p></remarks>
[Browsable(false),
Description("是否启用控件的视图状态,该属性的值必须为true,不允许用户设置。"),
DefaultValue(true),
Category("Behavior")]
public override bool EnableViewState
{
get
{
return base.EnableViewState;
}
set
{
base.EnableViewState=true;
}
}
#endregion
#region Control Rendering Logic
/// <summary>
/// 重写 <see cref="System.Web.UI.Control.OnLoad"/> 方法。
/// </summary>
/// <param name="e">包含事件数据的 <see cref="EventArgs"/> 对象。</param>
protected override void OnLoad(EventArgs e)
{
if(Page.Request.Form[this.UniqueID]!=null)
{
if(Page.Request.Form[this.UniqueID].Trim().ToString()!=String.Empty)
{
this.Text = DecodeFilter(Page.Request.Form[this.UniqueID]);
}
}
base.OnLoad(e);
}
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void RenderContents(HtmlTextWriter output)
{
Helper.InitResources();
//加入自己的版权信息!
string path = (ConfigFile==null?Helper.ResolvePath("/"):Helper.Context.Request.ApplicationPath+(ConfigFile.StartsWith("/")?ConfigFile:"/"+ConfigFile));
Helper.InitConfigFile(path);
Hashtable hs = ((System.Collections.Hashtable)Context.Application[path]);
System.Xml.XmlDocument doc = (System.Xml.XmlDocument)hs["Style"];
System.Xml.XmlNode node = doc.SelectSingleNode("/Root/Style[@Selected='true']");;
if(node==null)
{
output.Write(typeof(HtmlEditor).FullName+" 载入失败!配置文件格式不正确!");return;
}
node = node.SelectSingleNode("S_Name");
if(node==null)
{
output.Write(typeof(HtmlEditor).FullName+" 载入失败!配置文件格式不正确!");return;
}
string style = node.InnerText;
string width = doc.SelectSingleNode("/Root/Style/S_Name[text()='"+ style +"']").ParentNode.SelectSingleNode("S_Width").InnerText;
string height = doc.SelectSingleNode("/Root/Style/S_Name[text()='"+ style +"']").ParentNode.SelectSingleNode("S_Height").InnerText;
output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Type,"hidden");
output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Name,this.ClientID);
output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Value,this.Text);
output.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Input);
output.RenderEndTag();
output.Write("<IFRAME ID=\"LionSky_HtmlEditor\" src=\""+ Helper.ResolvePath("/") +"htmleditor.aspx?id="+ this.ClientID +"&style="+ Helper.Context.Server.UrlEncode(style) +"&configfile="+ path + (OriginalFileName==null?"":"&originalfilename="+OriginalFileName) + (SavePathFileName==null?"":"&savepathfilename="+SavePathFileName) + (SaveFileName==null?"":"&savefilename="+SaveFileName) +"\" frameborder=\"0\" scrolling=\"no\" width=\""+ width +"\" height=\""+ height +"\"></IFRAME>");
base.RenderContents(output);
//加入自己的版权信息!
}
/// <summary>
/// 将 HTML 元素的开始标记写入 HtmlTextWriter 输出流。
/// </summary>
/// <param name="writer">HtmlTextWriter 输出流</param>
public override void RenderBeginTag(HtmlTextWriter writer)
{
//加入自己的版权信息!
writer.WriteLine();
writer.WriteLine();
writer.Write("<!---------------------------- ");
writer.Write("HtmlEditor Start");
writer.WriteLine(" ------------------------------->");
writer.Write("<!-------- ");
writer.Write("Copyright:2003 Lion (lion.net@163.com , www.lionsky.net)");
writer.Write(" -----------");
writer.WriteLine(">");
writer.WriteLine();
}
/// <summary>
/// 将 HTML 元素的结束标记写入 HtmlTextWriter 输出流
/// </summary>
/// <param name="writer">HtmlTextWriter 输出流</param>
public override void RenderEndTag(HtmlTextWriter writer)
{
writer.WriteLine();
writer.WriteLine();
writer.Write("<!---------------------------- ");
writer.Write("HtmlEditor End");
writer.Write(" ---------------------------------");
writer.WriteLine(">");
writer.WriteLine();
writer.WriteLine();
}
/// <summary>
/// 处置使用的资源。
/// </summary>
public override void Dispose()
{
try
{
if (_license != null)
{
_license.Dispose();
_license = null;
}
}
catch{}
base.Dispose();
}
#endregion
#region Private Helper Functions
private string DecodeFilter(string html)
{
string str = html;
if(this.Scriptfilter)
{
str = Helper.DecodeFilter(html,"script");
}
if(this.Tablefilter)
{
str = Helper.DecodeFilter(html,"table");
}
if(this.Classfilter)
{
str = Helper.DecodeFilter(html,"class");
}
if(this.Stylefilter)
{
str = Helper.DecodeFilter(html,"style");
}
if(this.XMLfilter)
{
str = Helper.DecodeFilter(html,"xml");
}
if(this.NAMESPACEfilter)
{
str = Helper.DecodeFilter(html,"NAMESPACE");
}
if(this.Fontfilter)
{
str = Helper.DecodeFilter(html,"font");
}
if(this.Marqueefilter)
{
str = Helper.DecodeFilter(html,"marquee");
}
if(this.OBJECTfilter)
{
str = Helper.DecodeFilter(html,"object");
}
return str;
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -