随笔-313  评论-12138  文章-1  trackbacks-256

ASP.NET AJAX(Atlas)现存的一些常见问题以及解决方案[持续更新]

根据这一周的用户反馈来讲,ASP.NET AJAX(Atlas)从CTP到Beta 1,不能说是一个“进步”,当然也不能说是“退步”。作为一个变化如此巨大的新版本,ASP.NET AJAX似乎有些不够稳定,本文将列举出一些开发者社区中常见的问题以及相应的解决方案,并将不断更新,希望对各位朋友有所帮助。

以下两条来自微软公司的总监Shawn Burke的Blog(http://blogs.msdn.com/sburke/)。

从客户端调用Web Method时发生[Method Error 12031]或[Method Error 500]异常

若要从客户端调用某个服务器端Web Service中的Web Method,则该Web Service必须拥有Microsoft.Web.Script.Services.ScriptServiceAttribute属性:
[Microsoft.Web.Script.Services.ScriptService()]
public class MyService : System.Web.Services.WebService {
 
// 
}

若要从客户端调用某个定义与页面中的Page Method,则该Page Method必须用Microsoft.Web.Script.Services.ScriptMethodAttribute属性修饰(当然,System.Web.Services.WebMethod也是必不可少的),且必须为静态(static)方法。目前版本的一个Bug还导致我们必须在ASPX文件中定义这个Web Method,在CS文件中定义是没有作用的(真是无奈):
<script runat="server">
[System.Web.Services.WebMethod]
[Microsoft.Web.Script.Services.ScriptMethod]
    public static string GetHtml(string contextKey) {
        // 
    }
</script>


在模板控件(例如Login)或者数据绑定控件(例如GridView)中,Extender Control(包括AJAX Control Toolkit)无法正常工作

原因在于,Beta 1中所有的客户端脚本统一由ScriptManager管理,而ScriptManager是在PreRender时期遍历页面中的控件并输出必要的客户端脚本,但模板中的内容通常也是在PreRender时才生成的,这样二者错失了沟通的机会,自然模版中的Extender Control所必须的客户端脚本将不会被发送至浏览器,也就最终导致了Extender Control无法在模板控件中使用。

解决方法就是在PreRender之前,例如Load事件中强制让页面生成模版控件或数据绑定控件的内容,这样在PreRender的时候ScriptManager就可以正确找到他们了:
protected void Page_Load(object sender, EventArgs e)
{
    GridView1.DataBind(); 
// 数据绑定控件用这个

    
object o = Login1.Controls; // 模版控件用这个
}
posted on 2006-10-27 17:54 Dflying Chen 阅读(4424) 评论(20) 编辑 收藏

评论:
#1楼 2006-10-27 21:33 | 阿一      
是啊,有点麻烦。好多人问这个问题啊。
 回复 引用 查看   
#2楼[楼主] 2006-10-27 21:35 | Dflying Chen      
@阿一
这个Beta 1的Bug好多阿……

 回复 引用 查看   
#3楼 2006-10-28 00:21 | THIN      
@Dflying Chen
第二个刚碰到了,可以用脚本解决

 回复 引用 查看   
#4楼[楼主] 2006-10-28 09:50 | Dflying Chen      
@THIN
大哥怎么解决的阿?能不能分享一下?

 回复 引用 查看   
#5楼 2006-10-28 15:16 | leoxu[未注册用户]
我碰到使用UPDATPANEL的问题。
能帮忙我看一下吗?
http://post.youboy.com/topiclist.jsp?topicid=167595
asp.net ajax UpdatePanel 控件 问题
先谢谢了。

 回复 引用   
#6楼[楼主] 2006-10-28 16:31 | Dflying Chen      
@leoxu
估计是FCKEDIOTR有什么问题吧……这个就太难说了,那个FCKEDIOTR用了太多的JavaScript,说不定什么地方就会有冲突的……

 回复 引用 查看   
#7楼 2006-10-28 17:27 | 可可[匿名][未注册用户]
快乐的我的人生,是我成功的动力。

 回复 引用   
#8楼[楼主] 2006-10-28 20:07 | Dflying Chen      
@可可[匿名]
名人名言?

 回复 引用 查看   
#9楼 2006-10-29 11:55 | DaiWei[匿名][未注册用户]
this.ChoiceView.NavigateUrl = "javascript:SetNodeView('" + this.ResolveUrl("~/UIWorkFlow/ChoiceView.aspx") + "','" + this.Name.ClientID + "','" + this.HViewID.ClientID + "');";

protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string script = @"
function SetNodeView(url,txtControlID,IdControlID)
{
var sReturn=window.showModalDialog(url,'ChoiceView','dialogHeight:600px;dialogWidth:800px;status:no;help:no;');
if(sReturn!=null && sReturn!='undefined')
{
var s = new Array();
s = sReturn.split(',');
$get(IdControlID).value = s[0];
$get(txtControlID).value = s[1];
}
}";

Microsoft.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), this.ClientID, script, true);
}

 回复 引用   
#10楼[楼主] 2006-10-29 12:15 | Dflying Chen      
@DaiWei[匿名]
能否简要解释一下呢?

 回复 引用 查看   
#11楼 2006-11-09 11:05 | DaiWei[匿名][未注册用户]
PageMethodes的BUG已在BETA2中修正了.可以在CS中申明
 回复 引用   
#12楼[楼主] 2006-11-09 11:25 | Dflying Chen      
@DaiWei[匿名]
恩,真不错!

 回复 引用 查看   
#13楼 2006-11-09 18:02 | df[未注册用户]
我写的WEBSERVICE加了这个[Microsoft.Web.Script.Services.ScriptService()]
还是在JS调试里面报错:我写的WEBSERVICE没定义
真烦

 回复 引用   
#14楼[楼主] 2006-11-09 21:03 | Dflying Chen      
这个Web Service的Proxy又没有下载过来呢?检查一下web.config吧
 回复 引用 查看   
#15楼 2006-11-14 20:30 | 哈哈[匿名][未注册用户]
Bingo,THX
 回复 引用   
#16楼[楼主] 2006-11-14 23:06 | Dflying Chen      
@哈哈[匿名]
:)有帮助就好!

 回复 引用 查看   
#17楼 2006-12-14 15:45 | mimosa[未注册用户]
昨天我也遇到第二个问题了,我在updatepanel中放了个formview并让formview具有自动分页功能,按照您的说法在page-load中也进行了绑定。。。。。。但是点formview中的分页页码还是出现整页刷新。。。。。。。老大这是怎么回事?
 回复 引用   
#18楼[楼主] 2006-12-15 19:19 | Dflying Chen      
@mimosa
又没有相关代码呢?

 回复 引用 查看   
#19楼 2009-07-28 17:24 | 杨文彬9      
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="System.Web.Services" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">



<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>

<style type="text/css">
.handle{
width:10px;
height:10px;
background-color:#aaccee;
}
.resizing{
padding:0px;
border-style:solid;
border-width:3px;
border-color:#aaccee;

}
.modalFilter{
background-color:#aaccee;

}
</style>

<script runat="server" language="C#">
[WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static CascadingDropDownNameValue[]
GetStates(string konwnCategoryValues, string category)
{
return new CascadingDropDownNameValue[]
{
new CascadingDropDownNameValue("Washington","Washington"),
new CascadingDropDownNameValue("Oregon","Oregon")
};
}

[WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static CascadingDropDownNameValue[]
GetCounties(string konwnCategoryValues, string category)
{
if (konwnCategoryValues.Contains("Washington"))
{
return new CascadingDropDownNameValue[]
{
new CascadingDropDownNameValue("Adams","Adams"),
new CascadingDropDownNameValue("Asotin","Asotin"),
new CascadingDropDownNameValue("Benton","Benton"),
new CascadingDropDownNameValue("Chelan","Chelan"),
new CascadingDropDownNameValue("Clallam","Clallam")

};
}
else
{
if (konwnCategoryValues.Contains("Oregon"))
{
return new CascadingDropDownNameValue[]
{
new CascadingDropDownNameValue("Backer","Backer"),
new CascadingDropDownNameValue("Benton","Benton"),
new CascadingDropDownNameValue("Clackamas","Clackamas"),
new CascadingDropDownNameValue("Clatsop","Clatsop"),
new CascadingDropDownNameValue("Columbia","Columbia")
};
}
else
{
return null;
}
}
}



</script>

</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<br />
<br />
<asp:DropDownList ID="DropDownList1" runat="server" Width="200px">
</asp:DropDownList>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;
<asp:DropDownList ID="DropDownList2" runat="server" Width="200px">
</asp:DropDownList>
<br />

<cc1:CascadingDropDown ID="CascadingDropDown1" runat="server" TargetControlID="DropDownList1"
PromptText="Select a State"
Category="state"
LoadingText="[Loding States]"

ServiceMethod="GetStates"
>
</cc1:CascadingDropDown>

<cc1:CascadingDropDown ID="CascadingDropDown2" runat="server"
TargetControlID="DropDownList2"
ParentControlID="DropDownList1"
PromptText="Select County hurry!"
Category="county"
LoadingText="[Loading Counties]"

ServiceMethod="GetCounties"

>
</cc1:CascadingDropDown>
2009-07-28 17:20 杨文彬9:
郁闷了 我小白


 回复 引用 查看   
#20楼 2009-07-28 17:24 | 杨文彬9      
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="System.Web.Services" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">



<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>

<style type="text/css">
.handle{
width:10px;
height:10px;
background-color:#aaccee;
}
.resizing{
padding:0px;
border-style:solid;
border-width:3px;
border-color:#aaccee;

}
.modalFilter{
background-color:#aaccee;

}
</style>

<script runat="server" language="C#">
[WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static CascadingDropDownNameValue[]
GetStates(string konwnCategoryValues, string category)
{
return new CascadingDropDownNameValue[]
{
new CascadingDropDownNameValue("Washington","Washington"),
new CascadingDropDownNameValue("Oregon","Oregon")
};
}

[WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static CascadingDropDownNameValue[]
GetCounties(string konwnCategoryValues, string category)
{
if (konwnCategoryValues.Contains("Washington"))
{
return new CascadingDropDownNameValue[]
{
new CascadingDropDownNameValue("Adams","Adams"),
new CascadingDropDownNameValue("Asotin","Asotin"),
new CascadingDropDownNameValue("Benton","Benton"),
new CascadingDropDownNameValue("Chelan","Chelan"),
new CascadingDropDownNameValue("Clallam","Clallam")

};
}
else
{
if (konwnCategoryValues.Contains("Oregon"))
{
return new CascadingDropDownNameValue[]
{
new CascadingDropDownNameValue("Backer","Backer"),
new CascadingDropDownNameValue("Benton","Benton"),
new CascadingDropDownNameValue("Clackamas","Clackamas"),
new CascadingDropDownNameValue("Clatsop","Clatsop"),
new CascadingDropDownNameValue("Columbia","Columbia")
};
}
else
{
return null;
}
}
}



</script>

</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<br />
<br />
<asp:DropDownList ID="DropDownList1" runat="server" Width="200px">
</asp:DropDownList>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;
<asp:DropDownList ID="DropDownList2" runat="server" Width="200px">
</asp:DropDownList>
<br />

<cc1:CascadingDropDown ID="CascadingDropDown1" runat="server" TargetControlID="DropDownList1"
PromptText="Select a State"
Category="state"
LoadingText="[Loding States]"

ServiceMethod="GetStates"
>
</cc1:CascadingDropDown>

<cc1:CascadingDropDown ID="CascadingDropDown2" runat="server"
TargetControlID="DropDownList2"
ParentControlID="DropDownList1"
PromptText="Select County hurry!"
Category="county"
LoadingText="[Loading Counties]"

ServiceMethod="GetCounties"

>
</cc1:CascadingDropDown>
2009-07-28 17:20

 回复 引用 查看   
除非特别声明,本站内所有资源,包括但不限于文章,代码,图片等,均应用于Dflying版权说明
关于ASP.NET AJAX,您可以:
直接阅读ASP.NET AJAX文章分类
Atlas文章打包下载(截至4/28/2006)
加入ASP.NET AJAX学习团队
询问关于ASP.NET AJAX的问题
加入ASP.NET AJAX讨论群
阅读愚作《ASP.NET AJAX程序设计》
点击阅读
点击阅读


关于Windows Vista,您可以:
加入Windows Vista开发团队!
昵称:Dflying Chen
园龄:5年10个月
粉丝:127
关注:0

搜索

 
 

最新随笔

随笔分类(352)

随笔档案(313)

Blog Roll

Dflying的其他Blog

Online Chat

统计信息

积分与排名

  • 积分 - 2442908
  • 排名 - 7

最新评论

阅读排行榜

评论排行榜