Question

Je suis assez nouveau pour MVC. Je suis en train de mettre en place une page de recherche qui recherche un résultat de base de données et les retours. La zone de recherche se trouve dans une Html.BeginForm à mon avis, et ressemble à ceci:

   <% using (Html.BeginForm())
     { %>
      <%= Html.TextBox("searchBox", null, new { @id = "searchBox" })%>
       <div id="searchButtonsDiv">
        <input type="submit" value="Search" />
      </div>
  <% } %>

  //Results are returned in a ul and orgainized


   //Pagination below
   <% if (Model.HasPreviousPage)
      { %>
        <%= Html.RouteLink("Previous", "SearchResults", new { page = (Model.PageIndex - 1) })%>
   <% } %>
   <% if (Model.HasNextPage)
      {  %>
         <%= Html.RouteLink("Next", "SearchResults", new { formCollection = "", page = (Model.PageIndex + 1) })%>
   <% } %>

J'utilise un FormCollection pour passer à mon contrôleur qui ressemble à ceci:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection formCollection, int? page)
    {
        var searchString = formCollection["searchBox"]; 
        var results = resultsRepository.GetResults();

        var paginatedResults = new PaginatedList<Driver>(results, page ?? 0, pageSize);

        return View(paginatedResults);
    }

Jusqu'à présent, si bon. Lorsque je tape un mot et appuyez sur le bouton d'envoi, l'indice est appelé et la base de données retourne en conséquence. La ul obtient peuplé des résultats, et quand il y a plus de résultats pageSize (10 dans mon cas), le lien suivant apparaît.

Lorsque je clique sur « Suivant », la page par défaut des charges juste. Pas ou quelque chose comme la pagination qui. Je suis sûr qu'il a à voir avec le fait que mon indice ActionResult a FormCollection comme paramater. Je pensais que je l'ai lu quelque part que seules les chaînes / Ints peuvent être traitées? Voici le MapRoute:

        routes.MapRoute(
            "SearchResults",
            "Drivers/Index/{formCollection}/{page}",
            new { controller = "Drivers", action = "Index", formCollection = "", page = "" }
        );

Suis-je manque quelque chose de complètement ou est-il un moyen de gérer cela? Je sais que je pourrais simplement utiliser jquery / ajax pour envoyer la chaîne contenue dans la liste de recherche, mais je ne veux pas le faire parce que plus tard, je l'intention d'ajouter de case à cocher comme moyen de recherches de filtrage, etc.

J'ai essayé plusieurs façons différentes de mise en valeur du FormCollection, y compris la création d'une nouvelle FormCollection qui ajoute le SearchBox, et juste des chaînes passant, etc.

Était-ce utile?

La solution

L'argument FormCollection dans l'action n'est pas le problème. Cela fonctionnera toujours.

absolument ne fonctionne pas appartiennent à votre itinéraire, cependant! Il suffit de se débarrasser de cela et vous résoudrez probablement le problème. Les éléments de formulaire ne vont pas dans l'URI, et que des choses dans l'URI devrait être dans l'itinéraire.

Il est pas comment j'écrire que la signature d'action, cependant. Je vous suggère:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string searchBox, int? page)
{
    var results = resultsRepository.GetResults();

    var paginatedResults = new PaginatedList<Driver>(results, page ?? 0, pageSize);

    return View(paginatedResults);
}

Enfin: Vous ne devriez pas retourner un View d'un POST dans ce cas. Cela entraînera un comportement étrange pour l'utilisateur; par exemple, quand ils presse rafraîchir leur navigateur les avertir de nouveau soumettre le formulaire.

Vous devez soit:

  1. Utilisez un GET, pas POST pour les résultats de recherche.
  2. Rediriger au lieu de retourner une vue.

Je choisirais la première, personnellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top