2011-08-24 2 views
0

J'utilisais un ancien exemple pour MVC2, qui utilisait un attribut [fromJson] lors de l'envoi de json à une action du contrôleur, cela fonctionnait correctement, sauf qu'il n'attrapait pas les erreurs du modèle, donc ModelState. IsValid est toujours vrai. Puis j'ai vu que poster JSON était construit en MVC3 donc j'ai mis à jour mon code. Mais maintenant j'ai un autre problème :) en utilisant:Knockout et ko.utils.postJson numéro

ko.utils.postJson(location.href, json); 

La liaison ne fonctionne pas, et mon modèle est vide.

Mais si j'utilise JQuery:

$.ajax({ 
          url: '@Url.Action("Create")', 
          contentType: 'application/json; charset=utf-8', 
          type: "POST", 
          data: json, 
          dataType: 'json', 
          success: function(result) { 
           alert("yay"); 
          }, 
          error: function(xhr, ajaxOptions, thrownError) { 
           alert(xhr.statusText + " " + xhr.responseText); 
          } 
         }); 

Je pense que je vais passer mon ko.utils.postJson à JQuery $ .ajax mais comment puis-je poster que je puisse faire un RedirectToAction après?

Donc, pour clarifier! l'action du contrôleur ressemble à ceci:

public ActionResult Create(QuestionViewModel questionViewModel){ 

    if (ModelState.IsValid) 
    { 
     questionViewModel.Save(); 

     TempData.Add(Config.MODEL, questionViewModel); 
     return RedirectToAction("Edit"); 
    } 

    PopulateViewBag(); 

    return View(questionViewModel); 
} 

J'ai trouvé ce http://groups.google.com/group/knockoutjs/browse_thread/thread/e631a544de2ad51e dans le forum knockout, ko.utils.postJson est une forme « normale » soumettre. ce qui est ce que je veux faire, donc le flux de l'application est maintenu inchangé.

+0

Quelle est votre intention? Voulez-vous que l'appel ajax soit redirigé vers une nouvelle URL qui renvoie la réponse réelle pour l'appel ajax, OU voulez-vous que la page entière actuelle dans le navigateur soit redirigée vers une autre URL (Refreshed)? – Zasz

+0

J'ai essayé de clarifier ci-dessus. – rafn

Répondre

0

Puisque $ .ajax() ne crée pas de balise <form> et l'envoie, vous ne pouvez pas faire des choses comme RedirectToAction, pendant les ajax posts. ko.utils.postJson vous a permis de faire tout cela car il a créé en interne une balise de forme rapide dans le dom et l'a soumis via un script.

Qu'est-ce que vous pouvez faire est:

$.ajax({ 
    statusCode: { 
    302: function() { 
     window.location.replace("http://Domain.com/Controller/Edit") 
    } 
    } 
}); 

This question m'a aidé à trouver le moyen de rediriger le navigateur via le script. La page This vous indique comment gérer différents codes d'état renvoyés par le serveur. ASP.NET MVC3 renvoie le code d'état 302 lorsque vous utilisez RedirectToAction() dans le contrôleur. Et cela peut être géré, en ajoutant le gestionnaire approprié comme indiqué ci-dessus.

+0

Ok ça marche plutôt bien, je ne suis pas content de suivre ça en JavaScript. Peut-être que je vais revenir à knockout, et mettre en œuvre une validation du modèle qui était mon problème original ... hmmm – rafn

+0

Si vous êtes mal à l'aise de mettre l'URL dans le javascript, vous pouvez faire comme suggéré dans [ce] (http: // stackoverflow.com/questions/199099/how-to-manage-a-redirect-request-after-a-jquery-ajax-call) réponse. Ou encore plus approprié, regardez [this] (http://stackoverflow.com/questions/1557602/jquery-and-ajax-response-header) réponse à lire réellement l'URL à partir de l'en-tête ** Location ** de la réponse. – Zasz