2010-10-22 3 views
1

Voici une vue d'ensemble; J'ai une vue avec une table de données et en changeant les options de filtre (cases à cocher) J'appelle une action de filtre, fais un peu de travail, puis redirecttoAction à l'action principale qui accepte mes informations de filtre. En parcourant dans le débogage je peux voir les données attendues passées par les actions et même sur la vue avec le construction du html, cependant le html attendu avec plus ou moins de rangées ne rend pas - il reste le même que le a filtré par défaut liste.MVC RedirectToAction ne rend pas le html mis à jour dans la vue

Voici une partie du code.

HTML avec des cases à cocher:

<fieldset> 
<legend style="color: #27568e;">Filter</legend> 
    <table id="Filter"> 
     <thead> 
     </thead> 
     <tbody> 
      <tr> 
       <td> 
       <input type="checkbox" value="14" name="filterList" checked="checked"/>Type1 
       <input type="checkbox" value="15"name="filterList" checked="checked"/>Type2 
       <input type="checkbox" value="16" name="filterList" />Type3 
       <input type="checkbox" value="17" name="filterList" />Type4 
       <input type="button" value="Filter" id="Filterbutton" onclick="getFilterList('<%= Model.myId %>','filterList');" /> 
       </td> 
      </tr> 
     </tbody> 
    </table> 
</fieldset> 

Javascript/JQuery

<script type="text/javascript"> 

function getFilterList(id, checklist) 
    { 
     var data = {}; 
     var resultString = new String; 
     var selected = new Array(); 
     var loopCounter = 0; 
     jQuery("input[name=" + checklist + "]:checked").each(function() { 
      //selected[loopCounter] = jQuery(this).val(); 
      resultString += jQuery(this).val() + ","; 
      loopCounter += 1; 
     }); 
     resultString = resultString + id.toString(); 
     selected.push(id); 

     jQuery.post("/MyContr/Filter/", { resultStr: resultString }); 

    }; 
</script> 

Action Filtre à contrôleur - MyContr:

[AcceptVerbs(HttpVerbs.Post)] 
    public RedirectToRouteResult Filter(String resultStr) 
    { 
     string strList = string.Empty; 
     Stack<string> myStack = new Stack<string>(resultStr.Split(new string[] { "," }, StringSplitOptions.None)); 
     // Remove the id 
     var id = Convert.ToInt64(myStack.Pop()); 
     //convert rest of values (selected checkbox values) to string and pass to Review *was not able to pass array 
     //build strList 
     while (myStack.Count > 0) 
     { 
      strList += myStack.Pop() +","; 
     } 

     if (strList != string.Empty) 
      strList = strList.Remove(strList.Length - 1, 1); //remove last comma 

     return RedirectToAction("Review", "myContr", new{id=id,filterList=strList}); 
    } 

Action examen dans le contrôleur - MyContr:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Review(long id, string filterList) 
    { 

     string[] strArray = new string[]{}; 
     int[] filterArray; 

     if (filterList == null) 
     { 
      filterArray = new int[] { 14, 15 };//default to specific types 
     } 
     else 
     { //if filterList is not null 

      strArray = filterList.Split(new string[] { "," }, StringSplitOptions.None); //split string into array 
      //convert str[] to int[] 
      filterArray = new int[strArray.Length]; 
      for (int x = 0; x < strArray.Length; x++) 
      { 
       filterArray[x] = Convert.ToInt32(strArray[x].ToString()); 
      } 

     } 
     var myData = something.GetMyData(id); 

     ViewData["checkboxes"] = filterArray; 
     return View(myData); 
    } 

mon avis qui affiche la liste filtrée tableau à l'intérieur fieldset dont les lignes de données sont construites par foreach (pièce MyFilteredData)

* le code html à mon avis est contenu dans un aspic: bloc de contenu sans ouverture et fermeture des balises html

La page se charge correctement la première fois avec le filtre par défaut affichant le nombre correct de lignes dans ma table; La modification des cases à cocher à ajouter à la liste filtrée ne met pas à jour le code HTML comme prévu; Cependant, quand je débogue et passe par le code, les données correctes sont passées à travers les actions et retournent à la vue; il semble que son tout simplement pas rendu la nouvelle/mise à jour html

Est-ce que quelqu'un sait pourquoi ce ne est pas rafraîchissante ou rendre les données filtrées mises à jour, même si je peux voir à travers et l'étape ce que j'attends?

Répondre

1

Je ne suis pas un expert jQuery, mais votre méthode de publication ne doit-elle pas spécifier une fonction de rappel qui ajoute le code html renvoyé à un élément du DOM?

de la page de jquery:

$.post('ajax/test.html', function(data) { 
    $('.result').html(data); 
}); 

http://api.jquery.com/jQuery.post/

où le code html renvoyé est ajouté à l'élément à la classe .result via la méthode html.

plus de la page de jquery:

Exemple: Demander la page test.php, mais les résultats de ignorer retour.

$.post("test.php"); 

Exemple: Demander l'essai.page php et envoyer des données supplémentaires le long (tandis que toujours en ignorant les résultats de retour).

$.post("test.php", { name: "John", time: "2pm" }); 
1

Il y a 2 problèmes avec votre code. Comme le souligne @Francis Noriega, il doit y avoir une fonction de rappel dans votre jquery pour remplir la vue retournée dans la page.

Cependant, le plus gros problème est:

return RedirectToAction("Review", "myContr", new{id=id,filterList=strList}); 

Cela renvoie un HTTP 302 (redirection) à votre jquery code d'appel, et non le contenu html de l'action appelée. Vous devrez changer la méthode d'action pour retourner une vue partielle.

Questions connexes