System.Web.Mvc.JsonResult
использует старый класс JavaScriptSerializer
, который ничего не знает о сборке DataAnnotiations. Вам нужно использовать DataContractJsonSerializer .
Вы можете использовать это вместо этого в JsonResult, если хотите:
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);
}
}
}
(Я ссылался на исходный код ASP.NET MVC, чтобы создать это. Не уверен, если мне придется каким-то образом поверить в это. Что ж, больше, чем это в стороне, то есть.
Вы также можете добавить это к базовому классу, от которого наследуются ваши контроллеры:
protected JsonResult DataContractJson(object data)
{
return new DataContractJsonResult(data);
}