Je voulais quelque chose d'un peu plus cuit dans le cadre de ce que Jarrett a suggéré, voici donc ce que j'ai fait:
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() la méthode, ajouté à ma classe de contrôleur de base:
public ActionResult JsonContract(Object data)
{
return new JsonDataContractActionResult(data);
}
Exemple D'Utilisation:
public ActionResult Update(String id, [Bind(Exclude="Id")] Advertiser advertiser)
{
Int32 advertiserId;
if (Int32.TryParse(id, out advertiserId))
{
// update
}
else
{
// insert
}
return JsonContract(advertiser);
}
Remarque: Si vous êtes à la recherche de quelque chose de plus performant que JsonDataContractSerializer, vous pouvez faire la même chose à l'aide de JSON.NET au lieu de cela. Alors que JSON.NET ne semble pas utiliser DataMemberAttribute, il possède son propre JsonPropertyAttribute qui peut être utilisé pour accomplir la même chose.