Использование ASP.NET WebService с JavaScript - PullRequest
0 голосов
/ 17 июля 2009

У меня есть этот код в моем проекте:

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

и в моем проекте asp.net веб-сервис с именем PageServices:

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 в качестве функции обратного вызова для этого запроса.

Я тестировал эту работу, когда создавал веб-сервив, который просто возвращает объект String, и все было правильно, но я не знаю, почему для моего объекта PageLayout это неправильно.

Пожалуйста, помогите мне. Спасибо.

Ответы [ 2 ]

1 голос
/ 17 июля 2009

если он работал с возвратом строки, то вам, вероятно, нужно указать расширению ajax создать код JavaScript для объекта, который вы пытаетесь вернуть. Добавьте атрибут над вашим веб-методом

[GenerateScriptType(typeof(PageLayout))]

где PageLayout - имя класса, который возвращает GetPageLayout

0 голосов
/ 17 июля 2009

Я нашел решение, но это очень сложно, я написал JavaScriptConverter с именем PageLayoutJavaScriptConverter, например так:

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>

и все было правильно.

У меня вопрос, разве нет более простого способа сделать эту работу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...