调用js实现参数回调:
在default.aspx页面添加一个CKEditor控件和一个button控件
<form id="form1" runat="server">
<div id="div1">
</div>
<input id="Button1" type="button" value="显示内容" οnclick="GetTemp()" /><br />
</form>
页面中包含了一个id为div1的div和一个HTML的button控件,
注:此处不能用asp:button控件其中已经加入了一个GetTemp()函数作为onclick事件的响应接着我们来用javascript实现GetTemp()函数代码如下:
<script type="text/jscript">
function GetTemp() {
UseCallback();
}
//此处添加GetTempFromServer()函数
</script>
此处使用的是回调函数UseCallback();
为实现与底层页面参数的传递,我们在注释出添加GetTempFromServer()函数
代码如下:
function GetTempFromServer(arg, context) {
var html = arg;//获取arg参数的值
div1.innerHTML = html;//将获取的值传入div1的内部
}
在新建web页添加c#代码
private string _callbackReturn=null;//存放回调返回值
protected void Page_Load(object sender, EventArgs e)
{
//为当前页面注册一个javascript函数名为GetTempFromServer(),带两个参数,arg和context
string cbReference = Page.ClientScript.GetCallbackEventReference(this,
"arg", "GetTempFromServer", "context");
//在函数UseCallback(arg,context)中调用GetTempFromServer(arg,context)函数
string cbScript = "function UseCallback(arg,context)" +
"{" + cbReference + ";" + "}";
//为当前页面注册回调函数
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
"UseCallback", cbScript, true);
}
//在c#中定义一个回调函数的执行过程
public void RaiseCallbackEvent(string eventArg)
{
//如果session[“Html”]非空将值传入回调函数返回之中,此处实际应用中是值应取自数据库
if(this.Session["Html"]!=null)
_callbackReturn= this.Session["Label"].ToString();
}
//返回回调函数返回值
public string GetCallbackResult()
{
return _callbackReturn;
}
说了这么多,其实想要实现编辑的内容显示可以更简单一点,这样做:
<div id="id1" runat="server" ></div>
在后台直接用c#实现:
id1.InnerHtml =//CKEditor控件编辑的内容
关于上传的图片或者flash的文件名地址的获取问题
接着使用上面例子中的default.aspx页面,protected void Button1_Click1(object sender, EventArgs e)
函数中来截获最终编辑的文本中引用的图片或flash文件的文件名。
实现原理:
CKEditor作为一个asp.net的服务器端控件后,编辑生成的其实是一串HTML源代码
这样我们就可以分析html源码,使用正则表达式截取图片或flash文件的文件名。
实现操作:
在default.aspx.cs中添加
using System.Text;
using System.Text.RegularExpressions;
引入正则表达式功能。
在函数protected void Button1_Click1(object sender, EventArgs e)中
加入如下代码:
//正则表达式,用于截取的是引用资源中后缀名为jpg,bmp,gif的字符串,视情况自行修改
Regex r = new Regex("src[^>]*[^/].(?:jpg|bmp|gif)");
//从源代码中获取所有截取的文本串,其中this.mckeditor.Text为id为mckerditor的ckditor控件//中编辑得到的源代码
MatchCollection mc = r.Matches(this.mckeditor.Text);
//将string串存入FilePath数组中
string[] FilePath=new string[mc.Count];
for (int i = 0; i < mc.Count;i++ )
{
FilePath[i] = mc[i].Value.ToString();
}
//获取标准的FullPath
for(int i=0;i<file.Length;i++)
{
FilePath[i] = file[i].Replace("src=\" /",Server.MapPath("~/"));
}
foreach (string path in FilePath)
{
if (System.IO.Directory.Exists(path))
{
System.IO.FileInfo file = new System.IO.FileInfo(path);
if (file.IsReadOnly)
{
file.IsReadOnly = false;
}
file.Delete();
}
}
这样的我们就获取了编辑所得的文章中所引用的服务器端的所有图片资源的全路径名并且删除了服务器端上传的图片
另外:注意此处的网站发布是在非虚拟文件夹下的,如果存在虚拟文件夹。
例如文件夹名为virtual,修改为 :
FilePath[i] = file[i].Replace("src=\virtual\" /",Server.MapPath("~/"));
注:利用CKFinder控件上传的资源的名字如果是中文,采用上述方法会得到一串乱码,这时因为编码方式造成的,CKFinder的命名采用UTF-8,还未发现解决方法。所见建议上传的图片为英文或者数字,如果是中文,需管理员手动删除图片。