Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net中带有UpdatePanel的CodeMirror_C#_Asp.net_Ajax_Updatepanel_Codemirror - Fatal编程技术网

C# asp.net中带有UpdatePanel的CodeMirror

C# asp.net中带有UpdatePanel的CodeMirror,c#,asp.net,ajax,updatepanel,codemirror,C#,Asp.net,Ajax,Updatepanel,Codemirror,我正在ASP.NET web应用程序中使用CodeMirror。该web应用程序使用UpdatePanel(ajax)。 在ajax回发中,我无法从服务器端的CodeMirror文本框中获取更新的文本,回发后,文本被重置。如果我不使用“更新”面板,则此选项有效。我错过了什么 下面是代码镜像代码: editor = CodeMirror.fromTextArea(document.getElementById("<%=txtLua.ClientID%>"), {

我正在ASP.NET web应用程序中使用CodeMirror。该web应用程序使用UpdatePanel(ajax)。 在ajax回发中,我无法从服务器端的CodeMirror文本框中获取更新的文本,回发后,文本被重置。如果我不使用“更新”面板,则此选项有效。我错过了什么

下面是代码镜像代码:

 editor = CodeMirror.fromTextArea(document.getElementById("<%=txtLua.ClientID%>"), {
                matchBrackets: true,
                theme: "neat",
                pollInterval: 100,
                continuousScanning: 500
            });

<asp:UpdatePanel ID="upd" runat="server">
        <ContentTemplate>
            <asp:TextBox runat="server" ID="txtLua" Height="320" Width="600" TextMode="MultiLine"></asp:TextBox>
            <asp:Button ID="btn" runat="server" OnClick="btn_Click" Text="btn" />
        </ContentTemplate>
</asp:UpdatePanel>
editor=CodeMirror.fromTextArea(document.getElementById(“”){
是的,
主题:“整洁”,
投票间隔:100,
连续扫描:500
});

是否有使用CodeMirror的asp.net/C示例?非常感谢您的帮助。

简短的回答是:创建一个javascript事件挂钩,它可以在UpdatePanel开始工作之前提前触发,并手动调用CodeMirror的
.save()
函数

问题似乎是因为CodeMirror提供的auto magic
表单.submit
覆盖在ScriptManager将面板的ViewState传递回服务器后触发的。这意味着服务器只接收处于初始状态的文本框(CodeMirror尚未将您键入的内容放入其中)。我检查了Chrome中的DOM事件,ScriptManager的钩子始终领先于
表单。提交
覆盖CodeMirror添加的内容

我在加载CodeMirror后立即在submit按钮上添加了一个
.onclick
,解决了这个问题。以您的例子:

var editor = CodeMirror.fromTextArea(document.getElementById("<%=txtLua.ClientID%>"), {
            leaveSubmitMethodAlone: true,  //since you don't need this anymore, no reason to complicate your DOM
            matchBrackets: true,
            theme: "neat",
            pollInterval: 100,
            continuousScanning: 500
        });
window['cmLocalStateEvent'] = function () { editor.save(); };
//saveButton = document.getElementById("<%=btn.ClientID%>");  //grab the save button
//if (saveButton) {
//    saveButton.onclick = function () { editor.save(); };  //make it do what the submit action was going to do 
//}

<asp:UpdatePanel ID="upd" runat="server">
    <ContentTemplate>
        <asp:TextBox runat="server" ID="txtLua" Height="320" Width="600" TextMode="MultiLine"></asp:TextBox>
        <asp:Button ID="btn" runat="server" OnClientClick="if(window['cmLocalStateEvent'])window.cmLocalStateEvent();" OnClick="btn_Click" Text="btn" />
    </ContentTemplate>
</asp:UpdatePanel>
var editor=CodeMirror.fromTextArea(document.getElementById(“”){
leveSubmitMethodalone:true,//既然您不再需要它,就没有理由使DOM复杂化
是的,
主题:“整洁”,
投票间隔:100,
连续扫描:500
});
window['cmLocalStateEvent']=函数(){editor.save();};
//saveButton=document.getElementById(“”)//抓住保存按钮
//如果(保存按钮){
//saveButton.onclick=function(){editor.save();};//使其执行提交操作要执行的操作
//}
现在,
.onclick
位于ScriptManager挂钩之前,将首先触发。事实上,如果您在文本框上放置
OnTextChanged=
AutoPostBack=
,它甚至会在您刚才单击的按钮之前触发

本质上,诀窍是在脚本管理器将ViewState提交回服务器之前,让CodeMirror的保存应用于

编辑:
我发现自从发布这篇文章后,如果你的提交按钮也在UpdatePanel(你的)内,你会遇到麻烦。初次提交后,
.onclick
将不会持续,您将被重置为一个没有事件挂钩的干净按钮。我目前针对该场景的工作解决方案是添加一个
窗口['cmLocalSaveEvent']
函数,并将客户端
.onclick
添加到ASP模板中(因此面板刷新会将其放回给您)。更新了上面的代码以反映这一点。

简短的回答是:创建一个javascript事件挂钩,该挂钩在UpdatePanel开始工作之前提前触发,并手动调用CodeMirror的
.save()
函数

问题似乎是因为CodeMirror提供的auto magic
表单.submit
覆盖在ScriptManager将面板的ViewState传递回服务器后触发的。这意味着服务器只接收处于初始状态的文本框(CodeMirror尚未将您键入的内容放入其中)。我检查了Chrome中的DOM事件,ScriptManager的钩子始终领先于
表单。提交
覆盖CodeMirror添加的内容

我在加载CodeMirror后立即在submit按钮上添加了一个
.onclick
,解决了这个问题。以您的例子:

var editor = CodeMirror.fromTextArea(document.getElementById("<%=txtLua.ClientID%>"), {
            leaveSubmitMethodAlone: true,  //since you don't need this anymore, no reason to complicate your DOM
            matchBrackets: true,
            theme: "neat",
            pollInterval: 100,
            continuousScanning: 500
        });
window['cmLocalStateEvent'] = function () { editor.save(); };
//saveButton = document.getElementById("<%=btn.ClientID%>");  //grab the save button
//if (saveButton) {
//    saveButton.onclick = function () { editor.save(); };  //make it do what the submit action was going to do 
//}

<asp:UpdatePanel ID="upd" runat="server">
    <ContentTemplate>
        <asp:TextBox runat="server" ID="txtLua" Height="320" Width="600" TextMode="MultiLine"></asp:TextBox>
        <asp:Button ID="btn" runat="server" OnClientClick="if(window['cmLocalStateEvent'])window.cmLocalStateEvent();" OnClick="btn_Click" Text="btn" />
    </ContentTemplate>
</asp:UpdatePanel>
var editor=CodeMirror.fromTextArea(document.getElementById(“”){
leveSubmitMethodalone:true,//既然您不再需要它,就没有理由使DOM复杂化
是的,
主题:“整洁”,
投票间隔:100,
连续扫描:500
});
window['cmLocalStateEvent']=函数(){editor.save();};
//saveButton=document.getElementById(“”)//抓住保存按钮
//如果(保存按钮){
//saveButton.onclick=function(){editor.save();};//使其执行提交操作要执行的操作
//}
现在,
.onclick
位于ScriptManager挂钩之前,将首先触发。事实上,如果您在文本框上放置
OnTextChanged=
AutoPostBack=
,它甚至会在您刚才单击的按钮之前触发

本质上,诀窍是在脚本管理器将ViewState提交回服务器之前,让CodeMirror的保存应用于

编辑:
我发现自从发布这篇文章后,如果你的提交按钮也在UpdatePanel(你的)内,你会遇到麻烦。初次提交后,
.onclick
将不会持续,您将被重置为一个没有事件挂钩的干净按钮。我目前针对该场景的工作解决方案是添加一个
窗口['cmLocalSaveEvent']
函数,并将客户端
.onclick
添加到ASP模板中(因此面板刷新会将其放回给您)。更新了上面的代码以反映这一点。

这就是我如何使它工作的,以防其他人需要它。在实例化
editor
之后,每次发生
blur
事件时,我都会保持文本框对齐

editor.on('blur', function () {
    arguments[0].save();
});

这就是我设法使它工作的方式,以防其他人需要它。在实例化
editor
之后,每次发生
blur
事件时,我都会保持文本框对齐

editor.on('blur', function () {
    arguments[0].save();
});