2009-07-17 45 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 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類,它的序列化模式是Unidirectional。

最後一個錨鏈接:

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

我的問題是,它是正確的,併發送Ajax請求我的服務,當我點擊這個鏈接,我的服務回報需要的對象,但它不火_onShowLayoutSettings作爲此請求的回調函數。

我測試這項工作,當我創建一個web servive剛剛返回和String對象,它是正確的,但我不知道爲什麼我的頁面佈局的對象,這是不正確的。

請幫幫我。 謝謝。

回答

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> 

,一切正確。

我有一個問題,是不是任何其他做這項工作更簡單的方法?

1

如果它返回一個字符串的工作,那麼你可能需要告訴AJAX擴展創造你試圖返回對象的JavaScript代碼。添加您的WebMethod上述屬性

[GenerateScriptType(typeof(PageLayout))] 

其中頁面佈局是GetPageLayout返回

+0

我以爲當我這樣做的時候它會做對,但事實並非如此。我看到HTML源代碼,看到這個代碼: VAR GTC = Sys.Net.WebServiceProxy._generateTypedConstructor; Type.registerNamespace('DALEntities'); 如果(typeof運算(DALEntities.PageLayout)=== '未定義'){ DALEntities.PageLayout = GTC( 「DALEntities.PageLayout」); DALEntities.PageLayout.registerClass('DALEntities.PageLayout'); } //]]> – 2009-07-17 09:41:47

+1

確定我仍然認爲把該屬性在沒有在正確的方向。如果它仍然沒有工作,你可以編輯你的帖子來添加屬性 – 2009-07-17 09:44:58