日期:2010-09-05  浏览次数:20499 次

作者:Dflying Chen(http://dflying.cnblogs.com/
前面的一系列的文章都是直接调用单独的一个Web Service,而在实际项目开发中,特别是在对现有的项目转换中,把页面中的逻辑再提取到专门的Web Service中往往会带来相当多的工作。Atlas充分考虑到了这一点,允许您将服务器端的public方法加上[WebMethod]属性以允许客户端JavaScript的直接调用。

想允许客户端直接调用定义在ASPX页面中的方法,您需要指定该方法为public,并且添加[WebMethod]属性,例如如下定义在ASPX文件中的服务器端方法:

<script runat="server">
    [WebMethod]
    public int AddInt(int int1, int int2)
    {
        return int1 + int2;
    }
</script>

在客户端,Atlas将为您Mashup出一个AddInt的JavaScript方法,存在于一个特殊的命名空间PageMethods中,这样您就可以通过PageMethods.AddInt()调用上面的方法了。
同时,将WebMethod定义到ASPX页面中,您还可以在该方法中访问一切页面上的服务器端控件的值和ViewState,并且整个页面的的生存周期将和传统的ASP.NET页面PostBack一样,诸如Page_Load等方法均会被调用,可以让我们对页面有更强的访问能力。不过这样也带来了性能上的折扣,因为每次调用Web Method的时候都会把页面上的ViewState和控件的值传回给服务器,并且服务器端处理整个页面的生存周期将要比仅仅处理一个纯粹的定义在ASMX中的Web Method要复杂的多。所以这里我推荐尽可能的使用纯粹的Web Service,请参考:在Atlas服务器端实现中推荐使用Web Service而不是Page Method。

下面来看一个实例,首先来定义在ASPX中的WebMethod,可以看到这里不单单求两个数的和,还访问了一个页面上的服务器端TextBox的值:

<script runat="server">
    [WebMethod]
    public string AddInt(int int1, int int2)
    {
        return (int1 + int2).ToString() + string.Format("\r\nAnd the Server TextBox's Text is '{0}'.", tbServer.Text);
    }
</script>

然后是页面的ScriptManager,这里无需添加任何引用了: <atlas:ScriptManager ID="scriptManager" runat="server" />
然后两个用来输入加数的input以及用来触发服务器调用的input:

<input id="value1" type="text" value="1" />
<input id="value2" type="text" value="2" />
<input id="btnAdd" type="button" value="Add!" />
还有一个服务器端TextBox:

<asp:TextBox ID="tbServer" runat="server" Text="Server control"></asp:TextBox>
最后是JavaScript调用,注意PageMethods这个内建的命名空间:

function btnAdd_onclick() {
    PageMethods.AddInt(
        $('value1').value,
        $('value2').value,
        OnComplete
    );
}
function OnComplete(result)
{
    alert(result);
}
浏览器中运行,输入两个加数,然后在Server端的TextBox中输入一些字符,点击Add,可以看到Server端的TextBox的值却是被访问到了:


这是Fiddler截获的网络传输,可以看到ViewState和TextBox都被传回了Server: