Ответ 1
лучше всего наследовать от класса JsonResult и переопределить метод Execute, например
public class CustomJsonResult: JsonResult
{
public CustomJsonResult()
{
JsonRequestBehavior = JsonRequestBehavior.DenyGet;
}
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(MvcResources.JsonRequest_GetNotAllowed);
}
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) {
CustomJsSerializer serializer = new CustomJsSerializer();
response.Write(serializer.Serialize(Data));
}
}
}
код берется из класса JsonResult mvc3 и изменяет эту строку
JavaScriptSerializer serializer = new JavaScriptSerializer();
to
CustomJsSerializer serializer = new CustomJsSerializer();
вы можете использовать этот класс в методе действий, например
public JsonResult result()
{
var model = GetModel();
return new CustomJsonResult{Data = model};
}
Кроме того, вы можете переопределить json-метод класса Controller на вашем базовом контроллере, например
public class BaseController:Controller
{
protected internal override JsonResult Json(object data)
{
return new CustomJsonResult { Data = data };
}
}
теперь, если у вас есть все ваши контроллеры из BaseController, тогда return Json(data)
вызовет вашу схему сериализации. Существуют также другие перегрузки метода Json
, которые вы можете переопределить.