É possível usar JSON.NET como serializador JSON padrão na ASP.NET MVC 3?
De acordo com minha pesquisa, parece que a única maneira de conseguir isso é estender o ActionResult, já que JsonResult em MVC3 não é virtual ...
Eu esperava que com a ASP.NET MVC 3 houvesse uma maneira de especificar um provedor plugável para serializar em JSON.
Pensamentos?
asp.net-mvc-3
json.net
jsonresult
zam6ak
fonte
fonte
Respostas:
Acredito que a melhor maneira de fazer isso é - conforme descrito em seus links - estender ActionResult ou estender JsonResult diretamente.
Já para o método JsonResult que não é virtual no controlador isso não é verdade, basta escolher a sobrecarga certa. Isso funciona bem:
EDIT 1 : Uma extensão JsonResult ...
EDIT 2 : Eu removi a seleção de Dados sendo nulos conforme as sugestões abaixo. Isso deve deixar as versões mais recentes do JQuery felizes e parece a coisa mais sensata a se fazer, já que a resposta pode ser desserializada incondicionalmente. Porém, esteja ciente de que esse não é o comportamento padrão para respostas JSON da ASP.NET MVC, que em vez disso responde com uma string vazia, quando não há dados.
fonte
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
? Acho que preciso adicionar esta verificação na resposta (sem interno,MvcResources.JsonRequest_GetNotAllowed
mas com alguma mensagem personalizada). Além disso, que tal 2 outras verificações de mvc asp.net padrão - MaxJsonLength e RecursionLimit? Precisamos deles se usarmos json.net?Implementei isso sem a necessidade de um controlador de base ou injeção.
Usei filtros de ação para substituir o JsonResult por um JsonNetResult.
No Global.asax.cs Application_Start (), você precisaria adicionar:
Para fins de conclusão, aqui está minha classe de extensão JsonNetResult que peguei em outro lugar e que modifiquei um pouco para obter o suporte de vaporização correto:
fonte
return Json()
use Json.Net.JsonResult
deJson()
e o converte em umJsonNetResult
. Ele faz isso usando aas
palavra - chave que retorna null se a conversão não for possível. Muito bacana. 10 pontos para a Grifinória![BetterJsonHandler]
:-).Use o conversor JSON da Newtonsoft:
fonte
Eu sei que isso é bem depois que a pergunta foi respondida, mas estou usando uma abordagem diferente, pois estou usando injeção de dependência para instanciar meus controladores.
Substituí o IActionInvoker (injetando a propriedade ControllerActionInvoker do controlador) por uma versão que substitui o método InvokeActionMethod.
Isso significa que não há alteração na herança do controlador e pode ser facilmente removido quando eu atualizar para MVC4, alterando o registro do contêiner DI para TODOS os controladores
--- EDITAR - Atualizado para mostrar o registro do contêiner para controladores. Estou usando o Unity aqui.
fonte
Expandindo a resposta de https://stackoverflow.com/users/183056/sami-beyoglu , se você definir o tipo de conteúdo, o jQuery será capaz de converter os dados retornados em um objeto para você.
fonte
JObject jo = GetJSON(); return Content(jo.ToString(), "application/json");
Minha postagem pode ajudar alguém.
fonte
BaseController
, esta foi a mudança de menor impacto - só tive que adicionar a classe e atualizarBaseController
.Fiz uma versão que torna as ações de serviço da web seguras e simples. Você o usa assim:
A classe:
fonte