System.Web.Mvc.JsonResult
Verwendung der alten JavaScriptSerializer
Klasse, die nichts über die DataAnnotiations-Assembly weiß. Sie müssen die DataContractJsonSerializer stattdessen.
Sie können dies stattdessen auf JsonResult verwenden, wenn Sie dies wünschen:
public class DataContractJsonResult : JsonResult
{
public DataContractJsonResult(object data)
{
Data = data;
}
public DataContractJsonResult()
{
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.");
}
HttpResponseBase response = context.HttpContext.Response;
if (!string.IsNullOrEmpty(ContentType))
{
response.ContentType = ContentType;
}
else
{
response.ContentType = "application/json";
}
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
if (Data != null)
{
var serializer = new DataContractJsonSerializer(Data.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, Data);
string json = Encoding.UTF8.GetString(ms.ToArray());
response.Write(json);
}
}
}
(Ich habe auf den ASP.NET MVC-Quellcode verwiesen, um dies zu erstellen. Ich bin mir nicht sicher, ob ich ihn in irgendeiner Form erwähnen muss. Nun, mehr als diese Seite bereits ist, das ist. :))
Sie können dies auch zu einer Basisklasse hinzufügen, von der Ihre Controller erben:
protected JsonResult DataContractJson(object data)
{
return new DataContractJsonResult(data);
}