Ich wollte etwas, das etwas mehr in den Rahmen eingebacken ist als das, was Jarrett vorgeschlagen hat, also hier ist, was ich getan habe:
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() Methode, hinzugefügt, um meine Basis Controller-Klasse:
public ActionResult JsonContract(Object data)
{
return new JsonDataContractActionResult(data);
}
Verwendungsbeispiel:
public ActionResult Update(String id, [Bind(Exclude="Id")] Advertiser advertiser)
{
Int32 advertiserId;
if (Int32.TryParse(id, out advertiserId))
{
// update
}
else
{
// insert
}
return JsonContract(advertiser);
}
Hinweis: Wenn Sie nach etwas performanterem als JsonDataContractSerializer suchen, können Sie dasselbe mit JSON.NET tun. Während JSON.NET DataMemberAttribute nicht zu verwenden scheint, hat es sein eigenes JsonPropertyAttribute, das verwendet werden kann, um dasselbe zu erreichen.
Schauen Sie sich die neu veröffentlichten Sierra: http://kohari.org/2009/08/10/siesta-painless-rest-via-asp-net-mvc/ –
Das sieht vielversprechend (und interessant!), Aber ich Ich habe auf etwas gehofft, das bereits vorhanden ist. Kann ich den vorhandenen Serializer dazu bringen, die DataContract-Attribute zu respektieren? –