2010-07-18 5 views
1

J'ai un contrôleur appelé "Catégories" et vous pouvez taper quelques lettres et récupérer une liste filtrée.Maintien de l'état lors de la radiomessagerie

Matière assez standard. Cependant, je combine l'ensemble de résultats avec la pagination et j'ai rencontré un problème.

Lorsque vous entrez dans la page pour la première fois, toutes les catégories sont répertoriées. Lorsque vous tapez dans la zone de texte, vous obtenez une liste filtrée, mais je ne renvoie que la liste et la ré-afficher. Je ne montre pas la page entière à nouveau.

Maintenant, quand je clique sur le lien de la page 2, les filtres sont perdus et je suis à nouveau dans toute ma liste.

Je me rends compte que dans le code ci-dessous je ne saisis pas le texte du filtre dans ma catégorie ActionResult et c'est mon problème je pense. Juste besoin de savoir comment l'obtenir là-bas.

Comment puis-je maintenir la liste? Code pertinent ci-dessous;

Contrôleur

public ActionResult Categories(int? page) 
    { 
     CategoriesDataRepository categoriesRepository = new CategoriesDataRepository(); 
     CategoriesFormViewModel fvm = new CategoriesFormViewModel(); 
     fvm.categories = categoriesRepository.All().OrderBy(x => x.name).ToPagedList(page.HasValue ? page.Value - 1 : 0, CacheHelper.Get().CategoryPageSize); 
     return View(fvm); 
    } 

    public ActionResult jQueryFilterCategories(String filter) 
    { 
     CategoriesDataRepository categoriesRepository = new CategoriesDataRepository(); 
     return PartialView("CategoryList", categoriesRepository.All().Where(x => x.name.ToLower().Contains(filter.ToLower())).OrderBy(x => x.name).ToPagedList(0, CacheHelper.Get().CategoryPageSize)); 
    } 

Voir

<script type="text/javascript"> 
      $('.FindCategory').keyup(function() { 
       var searchText = $('.FindCategory').val(); 

       $.post('/Home/jQueryFilterCategories', { filter: searchText }, function (newHTML) { 
        $('.Categories').html(newHTML); 
        return false; 
       }); 
      }); 
</script> 

<div class="pager"> 
    <%= Html.Pager(Helpers.CacheHelper.Get().CategoryPageSize, Model.categories.PageNumber, Model.categories.TotalItemCount, "Categories", "Home")%> 
</div> 

<div class="CategoryList"> 
    <div> 
     <p>Type here to find categories <%= Html.TextBox("searchTerm", Model.searchTerm, new { @class = "FindCategory" })%></p> 
    </div> 

    <div class="Categories"> 
     <% Html.RenderPartial("CategoryList", Model.categories); %> 
    </div> 
</div> 
+0

Avez-vous envisagé d'utiliser une grille côté client comme JqGrid? J'aime ça parce que je n'ai pas besoin d'actualiser toute la page pour la pagination, le tri ou le filtrage. – Ryan

+0

Je l'avais considéré comme mon je n'aime pas beaucoup l'approche de la grille comme ils regardent toujours (griddy) et j'essaie de rendre cela accessible même pour ma et ma bouilloire savent ce que je veux dire? – griegs

Répondre

4
public ActionResult Categories(int? page, string? filter) 
{ 
    CategoriesDataRepository categoriesRepository = new CategoriesDataRepository(); 
    CategoriesFormViewModel fvm = new CategoriesFormViewModel(); 
    if (filter == null) 
     fvm.categories = categoriesRepository.All().OrderBy(x => x.name).ToPagedList(page.HasValue ? page.Value - 1 : 0, CacheHelper.Get().CategoryPageSize); 
    else 
     fvm.categories = categoriesRepository.All().Where(x => x.name.ToLower().Contains(filter.ToLower())).OrderBy(x => x.name)ToPagedList(page.HasValue ? page.Value - 1 : 0, CacheHelper.Get().CategoryPageSize); 
    return View(fvm); 
} 

En outre, vous devez modifier votre ActionLinks dans votre CategoryList partielle en conséquence.

+0

Oui, mais j'utilise un contrôle de pagination tiers qui ne le permet pas. Je devrais moduler le plugin qui va être une douleur. mais je soupçonne que cela doit être le chemin. – griegs

+0

Si vous ne voulez vraiment pas (ou ne pouvez pas) modifier votre contrôle de pagination, vous pouvez essayer de modifier le lien côté client en utilisant jquery. – kojo

+1

c'est exactement ce que j'ai fini par faire, mais cela ne veut pas dire que votre réponse n'était pas correcte. :) merci – griegs

1

Vous devriez essayer de donner à vos liens une fonction à réafficher via jquery, plutôt qu'un href. Ensuite, vous n'aurez pas à recharger la page.

$(".link").click(function() { 
    //redisplay results 
}); 
+0

Ouais j'aime vraiment ça. problème est que j'utilise un plugin 3ème partie que je devrais mod pour faire ce travail. pas la fin du monde juste une douleur. – griegs

+0

Peut-être qu'il est temps de changer de plugin? Lol, jk. – Charmander

+0

Cette pensée m'a aussi traversé l'esprit. :) – griegs

Questions connexes