使用ASP.NET WebService和javascript

时间:2009-07-17 08:48:39

标签: asp.net ajax linq web-services

我的项目中有这个代码:

var UI =
{
  Layouts:
  {
    ShowLayoutSettings: function(pid, lid) {
        My.PageServices.GetPageLayout(lid, pid, UI.Layouts._onShowLayoutSettings);
    },
    _onShowLayoutSettings: function(obj) {
            alert(obj.ID);
  }
  }
}

在我的asp.net项目中有一个名为PageServices的Web服务:

namespace My
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class PageServices : System.Web.Services.WebService
    {
        public PageServices()
        {
        }
        [WebMethod]
        [ScriptMethod(UseHttpGet = false, XmlSerializeString = true)]
        [GenerateScriptType(typeof(PageLayout))]
        public PageLayout GetPageLayout(string lid, int pid)
        {
            if (!SystemModel.UserManager.HasLogin())
                return null;
            var o = SystemModel.Layouts.GetPageLayout(pid);
            o.Tag = lid;
            return o;
        }
    }
}

我应该提一下,我的PageLayout类是一个linq类,它的序列化模式是单向的。

最后是锚链接:

<a href="#" onclick="UI.Layouts.ShowLayoutSettings(5,2);">Test</a>

我的问题是它是正确的,当我点击此链接时,我向我的服务发送ajax请求,我的服务根据需要返回该对象,但它不会激活_onShowLayoutSettings作为此请求的回调函数。

当我创建一个刚刚返回的Web服务器和String对象时,我测试了这项工作,这一切都是正确的,但我不知道为什么我的PageLayout对象,它不正确。

请帮帮我。 谢谢。

2 个答案:

答案 0 :(得分:1)

如果它返回一个字符串,那么你可能需要告诉ajax扩展为你想要返回的对象创建javascript代码。在webmethod

上方添加一个属性
[GenerateScriptType(typeof(PageLayout))]

其中PageLayout是GetPageLayout返回的类的名称

答案 1 :(得分:0)

我找到了解决方案,但是很难,我写了一个名为PageLayoutJavaScriptConverter的JavaScriptConverter:

public class PageLayoutJavaScriptConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get
        {
            return new Type[] { typeof(PageLayout) };
        }
    }
    public override object Deserialize(
        IDictionary<string, object> dictionary,
        Type type,
        JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }
    public override IDictionary<string, object> Serialize(
        object obj,
        JavaScriptSerializer serializer)
    {
        PageLayout e = obj as PageLayout;
        Dictionary<string, object> result = new Dictionary<string, object>();
        if (e != null)
        {
            result.Add("ID", e.ID);
        }
        return result;
    }
}

并将此标记添加到web.config:

<system.web.extensions>
<scripting>
    <webServices>
        <jsonSerialization>
            <converters>
                <add name="PageLayoutJavaScriptConverter" type="WebApp.Code.PageLayoutJavaScriptConverter"/>
            </converters>
        </jsonSerialization>
    </webServices>
    <scriptResourceHandler enableCaching="true" enableCompression="true"/>
</scripting>
</system.web.extensions>

一切都是正确的。

我有一个问题,是不是还有其他更简单的方法来做这项工作?