2010-02-25 6 views
1

Je suis assez nouveau pour MVC, cela peut sembler une question évidente, mais lorsque vous publiez sur mon ActionResult, le ActionResult est appelé, mais la vue ne change pas. Ce que je fais est d'avoir une page de recherche de base où un utilisateur peut rechercher ma base de données et les résultats sont retournés et paginés.

Voici javascript qui appelle ActionResult dans mon contrôleur.

function SubmitSearch() { 

    var searchBox = document.getElementById('searchBox'); 

    $.post("MyController/SearchResults/", 
    { 
     searchString: searchBox.value, 
     page: 0 
    }); 

    window.location = "../DriverStudio/Drivers/SearchResults/" + searchBox.value + '/0'; 
} 

Ma solution actuelle (qui est un horrible hack) est de commenter le .post de $ (depuis mon itinéraire est mis en place d'une manière où le window.location appellera le SearchResutls ActionResult) et définir la fenêtre .location à ce que l'utilisateur a recherché, en commençant à la page 0.

Il doit y avoir une meilleure façon. Que devrais-je faire?

Répondre

2

Configurez votre action SearchResults pour retourner une vue partielle ne contenant que la partie de la page mise à jour lorsque la recherche est effectuée. Cette pièce devrait être contenue dans un conteneur, ce qui rend facile à remplacer. Utilisez ensuite le mécanisme de rappel sur la méthode post pour remplacer le contenu de cette DIV par le résultat de la vue partielle renvoyé par votre action SearchResults. Renvoie false à partir de votre gestionnaire pour empêcher l'action de soumission par défaut d'être prise.

function SubmitSearch() { 

    var searchBox = $('#searchBox'); 

    $.post("MyController/SearchResults/", 
    { 
     searchString: searchBox.val(), 
     page: 0 
    }, function(data) { 
     $('#searchResults').html(data); 
    }); 

    return false; 
} 

Cela suppose un certain code de la vue qui ressemble à:

<% using (Html.BeginForm()) { % 
     <label for="searchBox">Search:</label> 
     <%= Html.TextBox("searchBox") %> 
<% } %> 
<div id="searchResults"> 
</div> 
+0

Merci tvan. Est-ce que ce doit être une vue partielle? Pourquoi ne pourrais-je pas retourner l'ensemble de la vue? – Darcy

+2

@Darcy - ce serait essentiellement la même chose que de faire un post normal (non-AJAX). L'utilisation d'une vue partielle envoie uniquement les parties mises à jour, ce qui est un peu le point d'utiliser AJAX. – tvanfosson

3

Je ne suis pas familier avec MVC, mais qu'est-ce que votre ActionResult faire autre que de rediriger l'utilisateur vers cette URL que vous avez dans window.location?

Vous avez probablement besoin de mettre en œuvre un rappel, de jQuery docs:

jQuery.post(url, data, callback, type) 

Donc vous passez l'URL et les données, mais rien de ce que vous voulez faire avec les données renvoyées.

$.post("MyController/SearchResults/", 
     {searchString: searchBox.value,page: 0}, 
     function(result){ 
       //do something with what your actionresult returns here 
       window.location = result.url; 
     } 
     ); 
+0

Hmm cela semble être le billet. 'result.url' ne fonctionne pas. Si j'alerte le 'résultat', j'obtiens la vue (donc le DOCTYPE .... etc stuff). Comment pourrais-je obtenir l'URL à partir de là? – Darcy

+0

Pourquoi faire un post AJAX si vous voulez simplement faire demi-tour et faire un GET normal en définissant l'URL? – tvanfosson

+0

Je pense à la façon dont tvanfosson décrit, en insérant le code HTML dans un div. Vous aurez probablement envie d'extraire les éléments dans la balise body seulement. –

Questions connexes