ASMX Web服务/序列化:如何强制“__type”属性包含在javascript中

时间:2011-04-26 19:51:51

标签: c# javascript web-services json asmx

我正在使用asmx webservices并通过它们序列化/反序列化大量数据,用于我正在处理的JSON管理面板。

当加载信息时,我调用一个将User []数组加载到javascript中的web服务。但是,我有大约25个User的子类,它们有自己独特的属性,实际上是通过这个webservice调用加载的。以这种方式加载它们似乎工作正常,但保存有一些问题。

save方法使用User []数组进行保存。在大多数子类中,javascript中没有__type提示,反序列化失败。它似乎在具有__type属性的类上工作正常。

所以我的问题是这个。如何强制__type包含在被序列化的javascript对象中?

这是我的C#调用加载对象(简化了一下)以防万一你需要它:

[WebMethod(EnableSession = true)]
public User[] GetUsersInGroup(int UserGroupID)
{
    List<User> UsersInGroup = User.GetUsersInGroup(UserGroupID);
    return UsersInGroup.ToArray();
}

这是保存方法:

[WebMethod(EnableSession = true)]
public void SaveUsers(User[] Users)
{
        foreach (User CurUser in Users)
        {
            CurUser.Save();
        }
}

根据要求,服务标题:

  [ScriptService]
    public class FormFields : System.Web.Services.WebService
    {

JSON(简化版) - 评论显示了不存在的内容:

{
    "d": [
        {
            "__type": "Tools.User.AccountingUser",  /* This is missing */
            "UserID": 3934,
            "HasQBAccess": true 
        },
        {
            "__type": "Tools.User.PowerUser",
            "UserID": 3937,
            "AccessDB": true,
            "AccessFTP": true 
        } 
    ] 
}

1 个答案:

答案 0 :(得分:1)

为了获得某种有效的答案,即使它不是一个好的答案。

到目前为止,我能找到的最佳答案是在我的webservice中添加一个非常长的难看的函数定义。我永远不必打电话给它,只是让它坐在那里让C#识别出类型:

[WebMethod(EnableSession = true)]
public void ThisMethodSucks(AccountingUser u1, PowerUser u2, AdminUser u3, DatabaseUser u4, ADAdministratorUser u5, PSUser u6, NUTUser u7, TechUser u8, ...[all classes here])
{
      //this method never needs to get called, just sits here.
}