CRUD機能にはLINQ-to-SQLを使用していますが、オブジェクトをJSONにシリアル化するにはDataContractJsonSerializer
を使用しています。また、ASP.NET MVCのデータバインディングを使用して、挿入するMVCアクションに値をポストします。問題は、(Idプロパティにを除く)のすべてのプロパティをシリアル化することです。私は、このモデルはように設定ガット:ここDataContractJsonSerializerが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
です:
[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
}
:
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
を返す)です私が考えることができるのは、フォームデータから直列化解除された後にデータが読み込まれたために、何らかの形でデータバインディングによってIdプロパティがシリアル化されないということだけです。助言がありますか?