2010-03-03 12 views
0

Je suis nouveau à la programmation web en général, donc c'est probablement une question très simple. Cependant, je n'ai rien trouvé sur le web. Ce que je veux faire, c'est appeler mon contrôleur avec la chaîne de recherche tapée et retourner les résultats d'une base de données et paginer les résultats. En ce moment j'utilise une fonction qui est appelée quand le bouton est pressé. La fonction ressemble à ceci:comment appeler le contrôleur à partir d'un clic de bouton sans utiliser ajax mvc

function SubmitSearch() { 

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

    $.post("MyController/MyAction/", 
    { 
     searchString: searchBox.value, 
     page: null 
    }, function(result) { 
     $('#searchResults').html(result); 
     searchButton.value = "Search"; 
    }); 
} 

Ce qui se passe est mon contrôleur est appelé, et mes searchresults div est rempli avec les résultats et paginé. L'utilisateur peut cliquer sur n'importe quel résultat de recherche pour afficher les détails. Le problème est lorsque l'utilisateur clique sur le bouton "retour" des navigateurs, la page revient à l'état avant que la recherche ait été entrée, et ce à cause de l'appel ajax. Ce que je veux faire, c'est d'appeler le contrôleur et d'avoir le chargement de la page comme google. Au lieu d'utiliser une vue partielle, j'utiliserais une vue (ma conjecture).

Comment appeler le contrôleur et avoir la page RELOAD avec les résultats. Je dois manquer quelque chose de fondamental parce que cela semble définitivement être facile.

Répondre

2

Si vous ne souhaitez pas utiliser AJAX, vous devez placer votre champ de texte dans un élément de formulaire sur votre page, quelque chose comme:

<form action="MyController/MyAction/" method="get"> 
    <input id="SearchBox" name="SearchBox" type="text" /> 
    <button type="submit">Search</button> 
</form> 

Ensuite, dans votre contrôleur retourner la vue avec la liste des résultats.

Vous voulez probablement aussi regarder dans RESTful URL et le modèle PRG (Post, Redirect, Get) pour maintenir l'intégrité du bouton arrière et permettre bookmarking correcte de pages etc.

+1

Merci, je suis allé avec cette solution, sauf que j'ai utilisé la façon MVC (<% en utilisant Html.BeginForm ("MyAction", "MyController") {%> .... – Darcy

1

Je pense que vous pourriez être à la recherche d'une bibliothèque AJAX History pour vous aider lorsque vous appuyez sur le bouton Précédent plutôt que de modifier votre application. Jetez un oeil à ce blog post.

+0

Je voudrais vraiment recharger la page. Dans mon action, j'ai un peu de codage bâclé pour prendre soin de la pagination et des pages de recherche (je dois appeler des vues différentes selon si l'appel était ajax ou non [mes autres pages paginées rechargent la page]) – Darcy

+0

votre exemple n'utilise pas Ajax donc c'est difficile à répliquer. Votre défi consiste à renvoyer l'action «retour» à votre contrôleur comme si une recherche avait été déclenchée avec les critères et la page de la pagination. Faire cela avec un db sur l'arrière risque également que l'ensemble de données retourné ait changé depuis la présentation originale à il n'y a aucune garantie. – Lazarus

1

Aspx:

<% using (Html.BeginForm<MyController>(m => m.MyAction(null)) { %> 
    <%= Html.TextBox("q"); %> 
<% } %> 
// Listing 

Controller:

public class MyController : Controller 
{ 
    public ActionResult MyAction(string q) 
    { 
     var repository; // instance of your repository. 

     if (String.IsNullOrEmpty(q)) 
     { 
      return View(repository.GetAllBlogs()); 
     } 
     return View(repository.SearchBlogs(q)); 
    } 
} 
+0

http://weblogs.asp.net/scottgu /archive/2010/10/22/asp-net-mvc-3-layouts.aspx s'il vous plaît lire – Penguen