ScrewTurn Wiki各种问题解决方法.

更换编辑器

鉴于ScrewTurn的编辑器很不好使用,我将其替换成了CKEditor.将替换方法记录如下.

第一步:安装CKEditor for ASP.NET

下载地点在http://ckeditor.com/download.由于我之前用的是ScrewTurn的ASP.NET版本,因此需要下载.NET版本

 

解压之后将_Samples/bin/CKEditor.NET.dll拷贝到ScrewTurn/bin文件夹中.并将CKEditor/ckeditor文件夹拷贝入ScrewTurn网站根目录下.

修改Web.config添加如下配置

<system.web>
        <pages>
            <controls>
                <add tagPrefix="CKEditor" assembly="CKEditor.NET" namespace="CKEditor.NET"/>
            </controls>
        </pages>
</system.web>

第二部:修改ScrewTurn代码

 ScrewTurn原有的Editor定义在Editor.ashx中,主要在Edit.aspx, Post.aspx和两个Admin页面中使用.在这里我们只替换掉Edit.aspx中的Editor控件,其他类似.

修改Edit.aspx中的

<st:Editor ID="editor" runat="server" OnSelectedTabChanged="editor_SelectedTabChanged" />

<p>
    <CKEditor:CKEditorControl ID="editor" runat="server" Toolbar="Full"></CKEditor:CKEditorControl>
</p>

其中的Toolbar="Full"表示工具栏中的项目,具体可以参考CKEditor的文档.

然后修改Editor.aspx.cs中所有对于editor的引用.主要是将原editor.content的get和set方法改成用CKEditor的Text属性,由于CKEditor没有Wiki Markup和可见即所得模式的区别,原来的两种模式的更改和载入的代码页可以去掉.

之后重新生成网站就大功告成了.

 

修正TAB无法切换问题

ScrewTurn使用了一个非常老的AJAX库Anthem,这个库的代码写的非常之诡异,导致ScrewTurn中很多使用AJAX的TAB切换无法正常操作.

修复方法如下

在ScrewTurn\References\Lib\Anthem.NET下,有Anthem的源码压缩包,解压之后包含了一个js文件和若干cs文件.js文件中的Anthem_Callback方法会向url?Anthem_CallBack=true Post一个获取数据的XHttpRequest.之后就由UpdatePage方法来更新页面.造成问题的如下一段代码

if (result.controls) {
    for (var controlID in result.controls) {
        var containerID = "Anthem_" + controlID.split("$").join("_") + "__";
        var control = document.getElementById(containerID);
        if (control) {
            control.innerHTML = result.controls[controlID];
            if (result.controls[controlID] == "") {
                control.style.display = "none";
            } else {
                control.style.display = "";
            }
        }
    }
}

这段代码会遍历result中的controls列表,然后生成containerID,之后去修改containerID对应的DOM元素的内容.

当标签无法切换的时候可以根据返回值生成的ID和页面中元素的ID是不对应的.

究其原因,是因为Manager.cs中生成页面id和生成AJAX返回值使用了不同的方法.

public static void WriteBeginControlMarker(HtmlTextWriter writer, string parentTagName, Control control)
{
    writer.Write("<{0} id=\"{1}\">", parentTagName, "Anthem_" + control.ClientID + "__");
    IUpdatableControl updatableControl = control as IUpdatableControl;
    if (updatableControl != null && updatableControl.UpdateAfterCallBack && IsCallBack)
    {
        writer.Write(_beginControlMarker);
        writer.Write(GetUniqueIDWithDollars(control));
        writer.Write("-->");
    }
}

这里可以看到,页面元素中的ID是使用control.ClientID生成的.

而AJAX返回的响应中的生成代码在如下两段

private Hashtable GetControls(string html)
{
    Hashtable controls = new Hashtable();

    // Find the first begin marker.
    int i = html.IndexOf(_beginControlMarker);
    // Keep looping while we've got markers.
    while (i != -1)
    {
        i += _beginControlMarker.Length;
        // Find the end of the begin marker.
        int j = html.IndexOf("-->", i);
        if (j == -1)
        {
            break;
        }
        else
        {
            // The string between i and j should be the ClientID.
            string id = html.Substring(i, j - i);

            // Point past the end of the begin marker.
            i = j + 3;
            string endMarker = _endControlMarker + id + "-->";
            // Find the end marker for the current control.
            j = html.IndexOf(endMarker, i);
            if (j == -1)
            {
                break;
            }
            else
            {
                // The string between i and j is now the HTML.
                string control = html.Substring(i, j - i);
                controls[id] = control;
                // Point past the end of the end marker.
                i = j + endMarker.Length;
            }
        }
        // Find the next begin marker.
        i = html.IndexOf(_beginControlMarker, i);
    }
    return controls;
}
if (_updatePage)
{
    string html = HttpContext.Current.Response.ContentEncoding.GetString(htmlBuffer.GetBuffer());
    viewState = GetViewState(html);
#if V2
    viewStateEncrypted = GetViewStateEncrypted(html);
    eventValidation = GetEventValidation(html);
#endif
    controls = GetControls(html);
    foreach (object o in _targets.Values)
    {
        Control c = o as Control;
        if (c != null && !c.Visible)
        {
            if (c.ID!= null && controls.ContainsKey(c.ID))
                controls[c.ID] = "";
        }
    }

    scripts = GetScripts(html);
}

在GetControls方法中,该库使用了在WriteBeginControlMarker写入的control.ClientID来生成controls表,之后又使用control.ID来生成controls表.

在msdn中,我们可以看到这三者的不同

UniqueID:此属性与 ID 属性不同,因为 UniqueID 属性包含服务器控件的命名容器的标识符。
ClientID: 如果 Web 服务器控件作为 HTML 元素呈现时, HTML 元素的 id 属性设置为 ClientID 属性的值。

 

这样一来,AJAX的返回显然有可能和页面中的元素ID不一致.

如果需要修正这个问题,只需要把这三个ID改成同一个(我使用的是UniqueID),然后重新生成Anthem.dll拷贝入网站的bin目录下就可以了.

转载于:https://www.cnblogs.com/triStoneL/p/3145838.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ScrewTurn Wiki 维基系统3.0源码 ScrewTurn Wiki 维基 是使用 ASP.NET 和 C# 创建的一个开源 wiki系统。默认情况下,ScrewTurn Wiki 的页面、修改历史记录和用户帐户均以文本文件保存,这意味着 wiki 不需要数据库,只需将 ScrewTurn Wiki 程序复制到 Web 服务器就完成部署。此外ScrewTurn Wiki 还提供了MS SQL Server? 和 MySQL 的DataProvider,当然您也可以实现自己的DataProvider,因为ScrewTurnWiki预留相应的Plugin接口。从3.0版 本开始,ScrewTurnWiki的源代码使用VS2008以WebApplication项目进行开发,因此进行代码修改更加方便。 ScrewTurn Wiki 维基系统 主要功能: 免费开源 无需使用一个数据库 (但是由SQL Server 和 MySQL 方面插件支持) 无需接触 IIS 和 ASP.NET 配置 (在 ASP.NET Medium Trust 环境下工作) 一个灵巧的可配置内容缓存系统促使其性能卓越和每个硬件配置均可扩展 可配置的ViewState Compression 和 HTTP Compression 的使用使其占用带宽少 易于配置,使用,管理 占用硬盘空间小,运行所需内存空间少 Theming 通过CSS支配(完全支持CSS Media Types ) 自动页面备份(执行一个备份就和单击鼠标一下一样简单) 简单的用户帐户系统 (管理员和用户以及一个内置 admin 帐户) 许多有用的功能eg:页面文明程度等级认证,可以让WIKI完全公开(编辑页面时可以无需注册)或设置私人页面(匿名用户不可以访问) 页面可分类和讨论 页面嵌入和部分显示 支持插件 阻止恶意文件,脚本,垃圾信息 (注册时需要Captcha 验证) 多语言界面 每个页面,页面上的讨论,整个WIKI均可进行RSS 2.0 验证 默认管理员:admin 密码:password
ScrewTurn Wiki是使用ASP.NET和C#创建的一个开源wiki系统。默认情况下,ScrewTurn Wiki的页面、修改历史记录和用户帐户均以文本文件保存,这意味着wiki不需要数据库,只需将ScrewTurn Wiki程序复制到Web服务器就完成部署。此外ScrewTurn Wiki还提供了MS SQL Server:registered:和MySQL的DataProvider,当然您也可以实现自己的DataProvider,因为ScrewTurnWiki预留相应的Plugin接口。从3.0版本开始,ScrewTurnWiki的源代码使用VS2008以WebApplication项目进行开发,因此进行代码修改更加方便。 ScrewTurn Wiki主要功能: 免费开源 无需使用一个数据库 (但是由SQL Server和MySQL方面插件支持) 无需接触IIS和ASP.NET配置 (在ASP.NET Medium Trust环境下工作)  一个灵巧的可配置内容缓存系统促使其性能卓越和每个硬件配置均可扩展 可配置的ViewState Compression和HTTP Compression的使用使其占用带宽少 易于配置,使用,管理  占用硬盘空间小,运行所需内存空间少 Theming通过CSS支配(完全支持CSS Media Types ) 自动页面备份(执行一个备份就和单击鼠标一下一样简单) 简单的用户帐户系统 (管理员和用户以及一个内置admin帐户)  许多有用的功能eg:页面文明程度等级认证,可以让WIKI完全公开(编辑页面时可以无需注册)或设置私人页面(匿名用户不可以访问) 页面可分类和讨论 页面嵌入和部分显示 支持插件 阻止恶意文件,脚本,垃圾信息 (注册时需要Captcha验证) 多语言界面  每个页面,页面上的讨论,整个WIKI均可进行RSS 2.0 验证 默认管理员:admin    密码:password

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值