2009-07-17 4 views
0

У меня есть этот код в моем проекте:Использование ASP.NET WebService с JavaScript

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 это неверно.

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

ответ

0

Я нашел решение, но это очень трудно, я написал 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> 

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

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

+0

Да, я удивлен вашим кодом, прежде чем этот конвертер не работает. Раньше у меня была аналогичная работа. Это кажется излишним. Но хорошо сделано для получения чего-то работающего –

+0

да! Большое вам спасибо за ответ. –

1

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

[GenerateScriptType(typeof(PageLayout))] 

где PageLayout это имя класса GetPageLayout возвращает

+0

Я думал, что когда я это сделаю, он будет делать правильно, но это не так. Я видел исходный код HTMl и видел этот код: var gtc = Sys.Net.WebServiceProxy._generateTypedConstructor; Type.registerNamespace ('DALEntities'); if (typeof (DALEntities.PageLayout) === 'undefined') { DALEntities.PageLayout = gtc ("DALEntities.PageLayout"); DALEntities.PageLayout.registerClass ('DALEntities.PageLayout'); } //]]> –

+1

Хорошо, я все еще считаю, что этот атрибут находится в правильном направлении. Если он все еще не работает, вы можете отредактировать сообщение, чтобы добавить атрибут –

+0

Длинный снимок, но может быть, у вас есть дополнительная запятая (,) после определения _onShowLayoutSettings(). некоторым браузерам (IE, я думаю) это не понравится. Я думаю, что FF может быть более прощающим –

Смежные вопросы