39 votes

Paramètre global ASP.NET MVC 2.0 JsonRequestBehavior

Par défaut, ASP.NET MVC 2.0 lève une exception lorsqu'une action tente de renvoyer JSON en réponse à une demande GET. Je sais que cela peut être remplacé méthode par méthode à l'aide de JsonRequestBehavior.AllowGet, mais est-il possible de définir un contrôleur ou une base supérieure (éventuellement le fichier web.config)?

Mise à jour: commentaire de Per Levi, c'est ce que j'ai fini par utiliser-

 protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding)
{
    return Json(data, contentType, JsonRequestBehavior.AllowGet);
}
 

27voto

Levi Points 22222

Ce, à l'instar d'autres MVC paramètres spécifiques, n'est pas réglable via le Web.config. Mais vous avez deux options:

  1. Remplacer le Contrôleur.Json(object, string Encoding) de la surcharge d'appel Json(object, string, Encodage, JsonRequestBehavior), en passant JsonRequestBehavior.AllowGet comme le dernier argument. Si vous voulez que cela s'applique à tous les contrôleurs, puis le faire à l'intérieur d'un résumé de la base de contrôleur de classe, alors tous vos contrôleurs de la sous-classe que la classe abstraite.

  2. Faire une extension de la méthode MyJson(ce Contrôleur, ...), ce qui crée un JsonResult et définit les propriétés appropriées, puis l'appeler à partir de votre contrôleur via ce.MyJson(...).

24voto

Dave Van den Eynde Points 8199

Il y a une autre option. Utilisez les filtres d'action.

Créez un nouveau ActionFilterAttribute, appliquez-le à votre contrôleur ou à une action spécifique (en fonction de vos besoins). Cela devrait suffire:

 public class JsonRequestBehaviorAttribute : ActionFilterAttribute
{
    private JsonRequestBehavior Behavior { get; set; }

    public JsonRequestBehaviorAttribute()
    {
        Behavior = JsonRequestBehavior.AllowGet;
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var result = filterContext.Result as JsonResult;

        if (result != null)
        {
            result.JsonRequestBehavior = Behavior;
        }
    }
}
 

Puis appliquez-le comme ceci:

 [JsonRequestBehavior]
public class Upload2Controller : Controller
 

3voto

Xorsat Points 1721

MVC 2 bloque Json pour les demandes GET pour des raisons de sécurité. Si vous souhaitez remplacer ce comportement, consultez la surcharge pour Json qui accepte un paramètre JsonRequestBehavior.

 public ActionResult Index()

{

   return Json(data, JsonRequestBehavior.AllowGet)

}
 

1voto

Rod Points 11

J'ai également eu cette erreur lorsque j'ai utilisé MVC 2.0 pour la première fois en utilisant mon ancien code dans MVC 1.0. J'utilise fiddler pour identifier la cause de l'erreur. Voir les étapes à suivre pour le dépanner avec Fidder -

http://www.rodcerrada.com/post/2011/07/11/jQuery-getJSON()-does-not-tirgger-the-callback-in-ASPNET-MVC-2.aspx

0voto

RobertC Points 188

Est-ce le problème de sécurité MVC2 tente d'aborder? http://haacked.com/archive/2009/06/25/json-hijacking.aspx

Si oui, il me semble que la vulnérabilité est seulement un problème si vous essayez de faire un appel json vers un site extérieur. Si votre MVC2 app est seulement de faire json appels vers votre propre site web (à remplir jqgrids par exemple), ne devriez-vous pas être en mesure de les écraser en toute sécurité l'appel Json dans votre contrôleur de base à toujours permettre d'obtenir?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X