为什么DataContractJsonSerializer不能序列化我的Id属性?

时间:2009-08-31 18:57:01

标签: asp.net-mvc linq-to-sql json serialization

我正在使用LINQ-to-SQL来实现CRUD功能,而DataContractJsonSerializer则将对象序列化为JSON。我还使用ASP.NET MVC的数据绑定将值发布到执行插入的MVC操作。问题是它将序列化所有属性,除了 Id属性。我已经将模型设置为:

[Serializable]
[DataContract(Name = "campaign")]
[Table(Name = "hl.campaigns")]
public class Campaign
{
    [DataMember(Name = "id")]
    [Column(Name = "id", AutoSync = AutoSync.OnInsert, IsDbGenerated = true, IsPrimaryKey = true)]
    public Int32 Id { get; set; }

    [DataMember(Name = "createdBy")]
    [Column(Name = "created_by")]
    public Int32 CreatedBy { get; set; }

    [DataMember(Name = "createdOnUtc")]
    [Column(Name = "created_on_utc")]
    public DateTime CreatedOnUtc { get; set; }

    [DataMember(Name = "name")]
    [Column(Name = "name", DbType = "NVarChar(256)")]
    public String Name { get; set; }

    /* more properties here */
}

这是我的自定义JsonDataContractActionResult

public class JsonDataContractActionResult : ActionResult
{
    public JsonDataContractActionResult(Object data)
    {
        this.Data = data;
    }

    public Object Data { get; private set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var serializer = new DataContractJsonSerializer(this.Data.GetType());
        String output = String.Empty;
        using (var ms = new MemoryStream())
        {
            serializer.WriteObject(ms, this.Data);
            output = Encoding.Default.GetString(ms.ToArray());
        }
        context.HttpContext.Response.ContentType = "application/json";
        context.HttpContext.Response.Write(output);
    }
}

这是动作(JsonContract()返回JsonDataContractActionResult):

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Modify([Bind(Prefix = "campaign")] Campaign campaign)
    {
        if (campaign.Id == 0)
        {
            try
            {
                CoreDB.Campaigns.InsertOnSubmit(campaign);
                CoreDB.SubmitChanges();

                return JsonContract(campaign);
            }
            catch(Exception ex)
            {
                // TODO: error handling
            }
         }
         return null; // TODO: modification
     }

我唯一能想到的是,数据绑定在某种程度上阻止了Id属性的序列化,因为它是在从表单数据反序列化后填充的。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

常规Json()方法为此对象返回什么?

根据这篇文章...... C#中的自动支持字段可能存在问题:

http://aaron-powell.spaces.live.com/blog/cns!91A824220E2BF369!150.entry