阻止JQuery AJAX调用返回ALL类属性

时间:2017-03-17 13:36:50

标签: c# jquery json

我编写了一个可以从javascript调用的Web服务。这一切都运转良好,但我注意到还有比我预期更多的房产......

URL: http://localhost/intranet/Contacts.asmx/ContactsDirectory

简而言之,它从数据库中读取员工并将其添加到列表中。请注意,我只添加了13个可用属性中的5个:

    foreach (DataRow row in ResultsDataTable.Rows)
    {
        var Employee = new Employees();
        Employee.Firstname = row["FIRSTNAME"].ToString();
        Employee.Surname = row["SURNAME"].ToString();
        Employee.PostTitle = row["POST"].ToString();
        Employee.Department = row["DEPTARTMENT"].ToString();
        Employee.Email = row["EMAIL"].ToString();
        employees.Add(Employee);
    }

我的员工类有13个属性:

public class Employees
{
    public string PersonRef;
    public string Firstname;
    public string Surname;
    public string PrefName;
    public string Telephone;
    public string PostRef;
    public string PostTitle;
    public string Department;
    public string Section;
    public string Location;
    public string Email;
    public string Manager;
    public string ManagersEmail;
}

我的AJAX请求:

xhr = $.ajax({
    type: 'POST',
    url: './intranet/Contacts.asmx/ContactsDirectory',
    data: JSON.stringify({ Name: "Scott" }),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json'
});

您可以从下面的响应中看到正在返回Properties Manager和ManagersEmail,但它们不在我的列表中!我该如何防止这种情况? 注意:我无法从我的类中删除任何属性,因为其他Web服务使用这些属性。

enter image description here

5 个答案:

答案 0 :(得分:0)

不同之处在于您以不同格式“查询”数据。 JSON始终显示对象的所有属性,因为您定义了它们 - 无论值是什么,它们都是对象的一部分。您没有 设置 这一事实并未改变对象定义... 谢天谢地:)

然而,使用XML,我们有不同的标准。默认情况下,.NET序列化程序(根据XML规范)不包含具有NULL值的属性,您应该使用适当的XML属性明确定义它:https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.isnullable(VS.85).aspx

此外,您可以参考关于在此处显示具有NULL值的元素的XML规范:https://www.w3.org/TR/xmlschema-1/#xsi_nil

答案 1 :(得分:0)

之所以出现差异是因为浏览器请求要求的响应格式与ajax请求不同。然而它实际上比那更微妙。它与两个序列化器之间功能不同的序列化设置有关。

JSON序列化程序设置设置为包含null属性,如果将其设置更改为省略null属性,则不会输出那些为null的字段。

您可以强制xml序列化程序在属性定义中使用属性来包含null属性。

无论如何,SO有很多关于如何让默认的json序列化器省略空值的答案。 here is one example

答案 2 :(得分:0)

如果序列化一个对象以通过json返回,那么即使它们为null,它也会占用该对象的所有属性。这是预期的行为,实际上有一个合理的原因(想想你想要知道属性为null的情况。)如果真的是一个问题,你有额外的属性,而不是创建一个只有的视图模型你想要的属性,然后选择你的数据,或者重构你的基类来处理。

答案 3 :(得分:0)

将[ScriptIgnore]属性添加到您不希望序列化为JSON的任何属性。

using System.Web.Script.Serialization;

public class Employees
{
    public string PersonRef;
    public string Firstname;
    public string Surname;
    public string PrefName;
    public string Telephone;
    public string PostRef;
    public string PostTitle;
    public string Department;
    public string Section;
    public string Location;
    public string Email;
    [ScriptIgnore]
    public string Manager;
    [ScriptIgnore]
    public string ManagersEmail;
}

答案 4 :(得分:0)

如果您可以将服务切换到WCF,则可以使用EmitDefaultValue

省略NULL值
[DataMember(EmitDefaultValue = false)]
public string Manager{ get; set; }

[DataMember(EmitDefaultValue = false)]
public string ManagerEmail{ get; set; }