2012-12-10 10 views
1

Ceci est mon premier post. Je suis désolé pour mon anglais ...Spring 3.1, réponse JSON ModelAndView

J'ai un problème avec postJSON et retourne une vue partielle avec ModelAndView.

Mon contrôleur:

@RequestMapping(method=RequestMethod.POST, value = "/addUrl.html") 
public @ResponseBody ModelAndView addSubMenu(@RequestBody Menu menu) { 
    ModelAndView mav = new ModelAndView(PathConfig.MENU_DIR + "show_url"); 

    int id = menuService.saveOrUpdateMenu(1, menu.getTitle(), menu.getUrl(), 4, "pl"); 
    mav.addObject("submenu", menuService.get(id)); 
    return mav; 
} 

Mon code ajax:

$("#menuUrl").submit(function(){ 
    var menu = $(this).serializeObject(); 

    $.ajax({ 
     type: "POST", 
     url: config.resourcePath+"/addUrl.html", 
     data: JSON.stringify(menu), 
     dataType: 'json', 
     contentType: "application/json; charset=utf-8", 
     success: function(response){ 
      $("#site").append(response); 
     }, 
     error: function(e){ 
      alert("Server did not response."); 
     } 
    }); 

}); 

Mais ... J'ai erreur: serveur n'a pas de réponse ...

Comment puis-je rendre vue partielle avec json?

Merci.

+1

Avez-vous un sérialiseur JSON sur le * classpath * comme Jackson et l'annotation '@ RequestMapping' a la valeur correcte de l'URL -'/addUrl.html'? – Lion

+0

Je suis confus. Voulez-vous retourner du HTML rendu ou un Datamodel JSON? Votre serveur souhaite sérialiser l'objet ModelAndView en tant que chaîne JSON et votre code jQuery souhaite ajouter un élément HTML au DOM. – Stefan

Répondre

0
$("#menuUrl").submit(function(){ 
    var obj = $(this).serializeObject(); 
    obj.parentId = getParentId(menuDivId); 

    $.ajax({ 
     url: config.resourcePath+"/addUrl.html", 
     data : JSON.stringify(obj), 
     contentType : 'application/json', 
     type : 'POST', 
     context: document.body, 
    }).done(function(response) { 
     $("#site").append(response); 
    }); 

    return false; 
}); 

et contrôleur renvoyant ModelAndView. Ça marche.

0

Il y a quelques choses qui pourraient être mal ici:

en spécifiant un en-tête Content-type de application/json vous attendez une réponse en retour de JSON, en regardant cependant la façon dont vous gérez la réponse qu'il ressemble à ce que vous veulent est un html

si elle est html que vous cherchez comme une réponse puis retirez l'en-tête Content-type de la requête, supprimer l'annotation @ResponseBody de réponse ModelAndView, au lieu simplement retourner une vue qui pointe vers une jsp normale qui peut créer la réponse html que vous attendez ..

@RequestMapping(method=RequestMethod.POST, value = "/addUrl.html") 
public ModelAndView addSubMenu(@RequestBody Menu menu) { 
... 
} 
+0

Ceci enverrait le code HTML (modèle fourni contrôleur de formulaire, vue fournie à partir de modèle) au client. Ce serait ma compréhension d'un partiel. Ensuite, vous devrez indiquer à JQuery d'attendre HTML ou Texte, mais pas JSON. – Stefan

0

Si ce que vous voulez est JSON de mettre à jour certaines parties de la page ne renvoient pas ModelAndView, retour String, assurez-vous d'avoir un sérialiseur JSON

@RequestMapping(method=RequestMethod.POST, value = "/addUrl.html") 
    public @ResponseBody String addSubMenu() { 
     //yourvariable 
     return yourvariable.toString(); 
    } 
+0

Cela livrerait ce que vous avez dans votre variable. Si vous souhaitez renvoyer un objet, pensez à renvoyer un objet et laissez Spring le placer sur JSON. Si vous voulez livrer un code de rendu de navigateur, je déléguerais le rendu de la vue au calque Vue en utilisant ModelAndView (sans l'annotation ReponseBody) comme résultat – Stefan

+0

Vrai, il retournera une chaîne, si un objet est nécessaire, remplacez String par votre objet et vous pouvez le sérialiser en utilisant la bibliothèque jackson par exemple. – pgardunoc

Questions connexes