【问题标题】:How to return an object with $.getJSON when this object is created with his parent class type使用其父类类型创建此对象时如何使用 $.getJSON 返回一个对象
【发布时间】:2014-09-11 18:41:15
【问题描述】:

好的,假设我有这 2 个类:

namespace CreeContact.CSBDObject.Object
{
    public class BaseObject
    {
    }
}

namespace CreeContact.CSBDObject.Object
{
    public class TestObject : BaseObject
    {
        public string name;
        public TestObject()
        {
            name = "Default";
        }
    }
}

我有一个创建对象并返回它的 wcf 服务:

namespace CreeContact.WebServices
{

    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Object
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public TestObject createobject()
        {

            TestObject objecttocreate = new TestObject();
            return objecttocreate;
        }
    }
}

这是我用 jquery 调用它的方式:

$.getJSON("WebServices/Object.svc/createobject", function (data) {
    alert(data.d.name);
});

当我执行这样的代码时:一切正常 - 警报显示“默认”。

但是假设我修改了这部分:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public TestObject createobject()
{

      TestObject objecttocreate = new TestObject();
      return objecttocreate;
}

对此:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public BaseObject createobject()
{

      BaseObject objecttocreate =(BaseObject) new TestObject();
      return objecttocreate;
}

我只是将创建的对象的类型更改为他的父对象的类型。

现在我在 javascript 中收到此错误:net::ERR_EMPTY_RESPONSE。

我做了验证,在 wcf 服务中创建对象没有错误。 Jquery 得到结果时出现错误。

其他信息:

这是为原始请求返回的对象:

这是当类型被定义为父对象时返回的对象:

【问题讨论】:

  • 错误来自 javascript,因为没有返回响应。我会调查您的 createobject() 方法以确定为什么没有返回任何内容。
  • 在浏览器控制台网络选项卡中检查实际请求本身,可以查看返回或未返回的内容
  • 我编辑了问题
  • 在浏览器中显示实际的网络响应,而不是您在 Visual Studio 后端看到的内容。我怀疑您的问题是您的对象被序列化为没有属性的BaseObject,因此您得到一个空响应。

标签: c# javascript jquery wcf


【解决方案1】:

因为如果您向下转换为基础对象,则没有定义 name 成员,因此您的 Web 服务不会向请求者发送任何内容

class BaseObject
{
    //This class contains no members
}

class ExtendedObject : BaseObject
{
    public string Name;
}

void Example()
{
    ExtendedObject extended = new ExtendedObject {Name = "Default"};
    BaseObject downcast = (BaseObject)extended;
    //This won't compile - Name is undefined because it's not defined in your base
    downcast.Name;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多