2017-01-30 4 views
1

Недавно я обнаружил странный сценарий, пытаясь переопределить метод Json класса Controller, чтобы использовать JSON.net. Он отлично работает, если в конце я возвращаю объект ContentResult и повышаю его до ActionResult. Однако это не сработает, если я попытаюсь вернуть объект JSONResult.Почему возвращение JSONResult из переопределенного метода Json не работает и ContentResult работает?

protected new ContentResult Json(object data, JsonRequestBehavior behaviour = JsonRequestBehavior.DenyGet) 
    { 
     var jsonSerializerSettings = new JsonSerializerSettings 
     { 
      ContractResolver = new CamelCasePropertyNamesContractResolver() 
     }; 

     if (Request.RequestType == WebRequestMethods.Http.Get && behaviour == JsonRequestBehavior.DenyGet) 
     { 
      throw new InvalidOperationException("GET is not permitted for this request"); 
     } 

     var jsonResult = new ContentResult 
     { 
      Content = JsonConvert.SerializeObject(data, jsonSerializerSettings), 
      ContentType = "application/json", 
     }; 

     return jsonResult; 
    } 

Есть ли какие-либо объяснения для этого?

+0

Почему нет? Что происходит? – SLaks

ответ

1

Ваш переопределенный Json метод должен возвращать JsonResult.

Вы можете сделать это с помощью ContentResult, потому что они оба наследуют от ActionResult класс.

Если вы хотите, чтобы это работало в любом случае, вы можете вернуть ActionResult с вашего переопределения. Но есть еще одна проблема: все ваши методы контроллера, которые будут использовать этот метод, также должны возвращать ActionResult.

Это может быть не большая проблема, но если вы хотите, чтобы ваш код был чистым, вы должны реализовать свою логику как ActionFilterAttribute и зарегистрировать его в FilterConfig для глобального использования.

+0

Я понимаю, почему он работает с ContentResult, но я совершенно не понимаю, почему он не работает, когда я использую JsonResult. Когда я возвращаю объект JsonResult, это то, что я получаю. «Этот запрос заблокирован, потому что конфиденциальная информация может быть раскрыта сторонним веб-сайтам, когда это используется в запросе GET. Чтобы разрешить запросы GET, установите JsonRequestBehavior в AllowGet». Это то, что мы получаем при попытке вызвать метод Json по умолчанию без указания AllowGet. –

+0

@HemAcharya так что вам нужно? allowGet всегда? –

+0

Я не хочу, чтобы allowGet всегда. Но даже если я явно передаю JsonRequestBehaviour.AllowGet, пока я возвращаю объект JSONResult из переопределенного метода, я получаю ошибку, о которой я упоминал. –

0

Вы используете JsonRequestBehavior.AllowGet при использовании JsonResult в качестве типа возврата?

+0

есть. Я использую JsonRequestBehavior.AllowGet. Но даже при этом, если я верну объект JSON из перегруженного метода, он в основном бросает такую ​​же ошибку, если бы я обычно вызывал Json-метод (без перегрузки) без передачи AllowGet. –

Смежные вопросы