Я хотел что-то более запеченное в рамках, чем предлагал Джарретт, поэтому вот что я сделал:
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 (), добавленный в мой базовый класс контроллера:
public ActionResult JsonContract(Object data)
{
return new JsonDataContractActionResult(data);
}
Пример использования:
public ActionResult Update(String id, [Bind(Exclude="Id")] Advertiser advertiser)
{
Int32 advertiserId;
if (Int32.TryParse(id, out advertiserId))
{
// update
}
else
{
// insert
}
return JsonContract(advertiser);
}
Примечание: Если вы ищете что-то более производительное, чем JsonDataContractSerializer, вы можете сделать то же самое, используя вместо этого JSON.NET. Хотя JSON.NET, по-видимому, не использует DataMemberAttribute, у него есть собственный JsonPropertyAttribute, который можно использовать для достижения той же цели.