65.9K
CodeProject 正在变化。 阅读更多。
Home

Magic Ajax Patch,用于 Textbox 和 scriptPath 参数中的 & 和 < 特殊字符

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2投票s)

2009 年 9 月 25 日

CPOL

2分钟阅读

viewsIcon

13704

如何修复 Magic Ajax Framework 中的一些错误

引言

在使用Magicajax 0.3时,我发现了它错误地将 & 替换为 &(将 < 替换为 &lt;)。 并且在尝试解决此问题时,文档中一个小小的拼写错误(大小写错误)给我带来了很大的困扰。

背景

Magic Ajax是一个免费的Ajax框架,适用于.NET 1.1和2.0(它也可以在Visual Studio Express 2008中运行)SourceForge。在我看来,它的突出特点是支持 .NET 1.1,并且它是一种非常容易使用的方式。 我不知道还有其他的Magicajax论坛,所以我就在这里发布了这个发现。 这里在CodeProject上也有其他一些文章。 如果你下载了它,请查看docs文件夹,因为框架中的几乎所有内容都在那里进行了说明(它既是参考资料,也是教程)。

&/< 替换 Bug

看一下这个最简单的Ajax表单(你必须下载并启用magicajax才能运行它)

<%@ Page Language="VB" %>
<%@ Register TagPrefix="ajax" Namespace="MagicAjax.UI.Controls" Assembly="MagicAjax" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
	"http://www.w3.org/TR/html4/loose.dtd">
<script runat="server">
    Protected Sub TextBox1_TextChanged_
	(ByVal sender As Object, ByVal e As System.EventArgs)
        Label1.Text = TextBox1.Text
    End Sub
</script>
<html>
 <body>
  <form id="form1" runat="server">
   <ajax:AjaxPanel ID="AjaxPanel1" runat="server"> 
     <asp:TextBox ID="TextBox1" runat="server" 
	AutoPostBack="true" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
     <asp:Label ID="Label1" runat="server" ></asp:Label> 
   </ajax:AjaxPanel>
  </form>
 </body>
</html>

更改Textbox1后,会执行一个Ajax请求来更新Label1。 只要你不在Textbox中输入&< 字符,它就可以正常工作。这些字符会在Textbox中被替换为&&lt;

你可能不会在你的应用程序中遇到这个bug,因为Magic Ajax至少有两种不同的方法来更改DOM - 在Ajax请求之后更改元素。

如果启用跟踪(将web.config magicAjax部分中的tracing属性设置为true),你会看到文档的不同部分由不同的JS函数更改。

...
AJAXCbo.SetField("TextBox1","&"); 
AJAXCbo.ExtendedSetHtmlOfElement("<span id=\"Label1\">&</span>","Label1$ajaxdest");
... 

AJAXCbo是处理Ajax处理的本地部分的本地JS对象。你可以在下载包的\Core\script\AjaxCallObject.js中找到它,但它也被编译在MagicAjax.dll中,并将作为动态webresource包含在ASP.NET页面中。

只要你不想更改它,这就很酷,在这种情况下,你可以更改源代码,或者更简单地使用web.config中的scriptpath参数来指向你选择的位置。

scriptPath的文档中存在错误。 在文档中,它被称为ScriptPath(大小写错误),这不起作用,但不会引发错误,因为它只是被忽略了。

这是我的web.config部分

<magicAjax 
 scriptPath="/myproject/myscript"
 outputCompareMode="HashCode"
 tracing="false">
  <pageStore
     mode="NoStore"
   />
</magicAjax>

Bugfix

在以下函数中

AjaxCallObject.prototype.SetField = function(fieldName, fieldValue) 

我替换

field.value = fieldValue;

简单的替换函数

if( fieldValue){
  var testValue = fieldValue;
  while( testValue.indexOf("&") >= 0 ){
   	testValue = testValue.replace("&","&");
        }
     testValue = testValue.replace("&lt;", "<");
     field.value = testValue;
   }else{
    field.value = fieldValue;
 }

(while循环仅用于处理 &amp; 之类的情况。)

警告

此补丁程序假定你没有使用HTML实体 & 和 &lt; 作为你的输入项的值,这些值不能被 & 和 < 替换。

Magicajax 社区

我不知道网上是否还有活跃的magic ajax社区。如果你知道一个社区,或者你自己使用它,请留下评论。

历史

  • 2009年9月25日:初始帖子
© . All rights reserved.