C# asp.net中带有UpdatePanel的CodeMirror
我正在ASP.NET web应用程序中使用CodeMirror。该web应用程序使用UpdatePanel(ajax)。 在ajax回发中,我无法从服务器端的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%>"), {
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();
});