2009-04-28 44 views
1

我正在构建一个ASP.NET 3.5应用程序,并希望在我的WebService类中公开一个枚举,而不将其用作我的WebMethods中的参数。在WebMethod中不使用Enum而将Web服务的客户端JavaScript暴露给WebService?

我有一个非常简单的例子来说明我想要什么?比方说,我有以下的WebService(我称之为Agent.asmx):

<System.Web.Script.Services.ScriptService()> _ 
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _ 
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ 
<ToolboxItem(False)> _ 
Public Class Agent 
    Inherits System.Web.Services.WebService 

<WebMethod(EnableSession:=True)> _ 
Public Function DoSomething(ByVal doWhat As WhatEnum) As Boolean 
    Return ... 
End Function 

End Class 

Public Enum WhatEnum 
    AskStackOverflowQuestion 
    PhoneAFriend 
    FiftyFifty 
End Enum 

因为我用的枚举一个

if (typeof(SomeNamespace.WhatEnum) === 'undefined') { 
    SomeNamespace.WhatEnum = function() { throw Error.invalidOperation(); } 
    SomeNamespace.WhatEnum.prototype = { AskStackOverflowQuestion: 0,PhoneAFriend: 1,FiftyFifty: 2} 
    SomeNamespace.WhatEnum.registerEnum('SomeNamespace.WhatEnum', true); 
} 

现在我可以去何地我想用这些枚举:对的WebMethods,它将输出在JavaScript中当WebService在我的.aspx页面中(从http://localhost/Agent.asmx/js)被引用为代理生成以下在客户端。现在,这一切都很好,但是我的代理中有另一个Enum,我没有在任何WebMethods中实际使用过,我也希望在代理的JavaScript中自动公开它。有没有办法,或许是一个属性或我可以使用的东西,使它被包含在内?

如果不是这样,我的回退解决方案是创建一个虚拟方法,使用我的Enum作为参数,这样它就可以使用,并且根本不会从JS调用它,尽管我宁愿不乱扔代码。谢谢!

回答

1

显然最简单的解决方案是创建虚拟方法。我想我很想知道为什么你需要从你的web服务中获得一个枚举来在你的JavaScript中可用,如果你永远不会将该枚举传递给服务或者以任何方式从服务中接收它。

+0

枚举用于服务;它作为一个被序列化并返回为JSON的类的属性传递回客户端。 – 2009-04-28 15:14:06

+0

我选择使用虚拟方法来完成所有工作 - 这是最容易实现的。 – 2009-05-02 18:06:46

0

你至少在服务中使用枚举吗?否则,它不属于那里。

我相信你应该看看[XmlInclude]属性。

+0

枚举在服务中使用;它作为一个被序列化并返回为JSON的类的属性传递回客户端。 – 2009-04-28 15:13:12

+0

所以,如果你只是正常地返回那个类,那么枚举就在那里,对吧? [ScriptService]无法使用? – 2009-04-28 18:41:37

+0

我试过XmlInclude,我想这只适用于WSDL,并且你必须为Enum创建一个虚拟的类包装器,因为它不会在Enums上工作目录。 – 2009-04-28 19:07:08