quería algo un poco más integrado en el marco de lo que sugirió Jarrett, así que esto es lo que hice:
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 método(), añadido a mi clase controlador base: Uso
public ActionResult JsonContract(Object data)
{
return new JsonDataContractActionResult(data);
}
muestra:
public ActionResult Update(String id, [Bind(Exclude="Id")] Advertiser advertiser)
{
Int32 advertiserId;
if (Int32.TryParse(id, out advertiserId))
{
// update
}
else
{
// insert
}
return JsonContract(advertiser);
}
Nota: Si está buscando algo más eficaz que JsonDataContractSerializer, puede hacer lo mismo con JSON.NET. Aunque JSON.NET no parece utilizar DataMemberAttribute, sí tiene su propio JsonPropertyAttribute que se puede usar para lograr lo mismo.
Echa un vistazo a la recientemente lanzada Sierra: http://kohari.org/2009/08/10/siesta-painless-rest-via-asp-net-mvc/ –
Esto parece prometedor (¡e interesante!), Pero yo estaba esperando algo ya procesado. ¿Hay alguna forma de que el serializador existente respete los atributos de DataContract? –