• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
XPP的Blog
博客园    首页    新随笔    联系   管理    订阅  订阅

关于Asp.net ajax客户端使用服务器端类型:GenerateScriptTypeAttribute

今天研究了下在老赵这个视频第22分钟貌似尚未解决的问题,初步结论如下:

MSDN解释:

GenerateScriptTypeAttribute 类 - 指定服务器类型必须在代理对象中生成。无法继承此类。 意思就是说在这个特性后标记的类型一定会在客户端生成代理,也就是查看源代码可以发现如下的代码(当InlineScript="true"):

var gtc = Sys.Net.WebServiceProxy._generateTypedConstructor;
if (typeof(ClassName) === 'undefined') {
var Color=gtc("ClassName");
ClassName.registerClass('ClassName');
}


但是如果我们没有在方法中标记该特性,那么某些服务器端的类型也会在客户端生成代理。
比如有如下的客户端代码(又借用了老赵的代码。。。):

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
    <Services>
        <asp:ServiceReference Path="ColorService.asmx" InlineScript="true" />
    </Services>
</asp:ScriptManager>
<script language="javascript" type="text/javascript">
    function ReverseColor()
    {               
        var a = new Color();
        a.Red = 50;
        a.Green = 100;
        a.Blue = 200;
        ColorService.Reverse(a, onSucceeded);
    }

    function onSucceeded(result)
    {
        alert(String.format(
            "Red: {0}\nGreen: {1}\nBlue: {2}",
            result.Red,
            result.Green,
            result.Blue));    
    }
</script>

 

其中客户端调用的ColorService.Reverse 来自WebService,定义如下:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public classColorService: System.Web.Services.WebService
{
    [WebMethod]
    //下面可以被注释
    //[GenerateScriptType(typeof(Color))]
    public Color Reverse(Color color)
    {
        return newColor(
            (byte)(255 - color.Red),
            (byte)(255 - color.Green),
            (byte)(255 - color.Blue));
    }
}

此时,无论加不加 [GenerateScriptType(typeof(Color))]都无所谓 因为已经在方法里指定了类型(参数或者返回值),这样在客户端页面显示的时候,即使不加GenerateScriptType,服务器端类型也会被注册(本文开头的4行代码)

经试验,以下的WebService方法签名,Color 类型也会被自动注册到客户端:

    public Color Reverse(object color)
    public object Reverse(Color color)

那为什么还需要GenerateScriptType呢? 这里可以很明显的看出,只有当类型和返回值与客户端类型均不相同的时候,GenerateScriptType特性才体现出了意义:

[WebMethod]
//下面一行不能被注释,否则客户端会报错找不到类型
[GenerateScriptType(typeof(Color))]
public object Reverse(object a)
{
    return new Color(
        (byte)(255 - ((Color)a).Red),
        (byte)(255 - ((Color)a).Green),
        (byte)(255 - ((Color)a).Blue));
}
 

这样我们就能得出结论:

使用GenerateScriptType 是服务器类型注册到客户端的充分非必要条件(不用它也有可能被注册),使用该属性的好处应该是体现在客户端和服务器交互时能够有面向对象特性或者说是一定程度上体现出的多态性(本例中的Color->object

本文所提及的代码下载:(解压放在同一个website 目录下即可)
http://www.xpp.com.cn/AspnetAjax/ClientCallWebService/GenerateScriptType.zip

posted @ 2009-12-23 02:50  Peter_xpp  阅读(317)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3