2014-09-09 3 views
0

Dans une vue de liste fortement typée, j'essaie de transmettre les données actuelles (en tant que liste du modèle) à mon contrôleur via Ajax, pour qu'il puisse faire quelque chose avec ça.MVC/AJAX - envoi de la collection du modèle au contrôleur

Le problème auquel je suis confronté est que je n'arrive pas à transmettre la liste de données dans la vue actuelle à mon contrôleur. L'utilisation de la méthode AJAX sans paramètre fonctionne (mais j'ai besoin d'utiliser le paramètre, ou s'il y a un autre moyen de fournir ces informations à mon contrôleur?).

J'ai également essayé de faire une liste (test) lorsque la vue est en cours de construction, puis d'utiliser cette variable comme paramètre mais apparemment après construction la variable est vide?

vue Index

@model IEnumerable<databaseModel.cbms> 

@{ 
    ViewBag.Title = "Cbms Home"; 
    List<databaseModel.cbms> test = Model.ToList(); 
} 

@Ajax.ActionLink("productId", "AJX_SortByProductId", new { cbmsModel = test }, new AjaxOptions() 
        { 
         HttpMethod = "GET", 
         UpdateTargetId = "divCbms", 
         InsertionMode = InsertionMode.Replace 
        }) 

Contrôleur

public PartialViewResult AJX_SortByProductId(List<cbms> cbmsModel) 
     {    
      //Retrieves the data 
      List<cbms> model = cbms.SortByProductId(); 
      //Returns the partial view 
      return PartialView("_Cbms", model); 
     } 

Alors, quand je rentre dans le contrôleur, la liste cbmsModel est vide et je ne peux pas l'utiliser comme un paramètre. Je peux transmettre une chaîne sans problème, mais je veux une liste des données du modèle actuel sur ma vue.

EDIT:

Ce qui suit ne fonctionne pas non plus:

Modèle

@model IEnumerable<databaseModel.cbms> 

@{ 
    ViewBag.Title = "Cbms Home"; 
    List<databaseModel.cbms> test = Model.ToList(); 
    List<databaseModel.cbms> cbmsModel = new List<databaseModel.cbms>();  
    int i = 0; 
    foreach (databaseModel.cbms value in test) 
    { 
     i++; 
     TempData.Add(i.ToString(), value); 
    }   
} 


@Ajax.ActionLink("productId", "AJX_SortByProductId", new { cbmsModel = TempData.Values.ToList() }, new AjaxOptions() 
       { 
        HttpMethod = "GET", 
        UpdateTargetId = "divCbms", 
        InsertionMode = InsertionMode.Replace 
       }) 

Il en résulte encore dans le paramètre étant vide. Je ne comprends pas pourquoi ...

+0

Soit stocker la liste dans la ViewBag et de l'utiliser à l'intérieur du contrôleur ou stringify vos données sur la vue avant l'envoyer sur le serveur. –

+0

J'ai essayé de le stocker dans le Viewbag (par exemple Viewbag.Temp, ViewBag.Temp = test OU ViewBag.Temp = Model.ToList();), mais le Viewbag.Temp est également vide quand je le passe dans ma méthode Ajax. – DaGrooveNL

+0

Après un long débogage, j'ai découvert que cbmsModel se débarrasse de l'affichage de la vue, y compris toutes les autres variables sauf TempData. Maintenant, la question est, comment puis-je utiliser TempData pour transmettre la variable? Depuis l'utilisation @ Ajax.ActionLink ("ProductID", "AJX_SortByProductId", nouvelles {cbmsModel = TempData.Values.ToList()}, nouveaux AjaxOptions() { HttpMethod = "GET", UpdateTargetId = "divCbms", InsertionMode = InsertionMode.Replace }) ne fonctionne pas. – DaGrooveNL

Répondre

0

EDIT: S'il vous plaît voir le commentaire ci-dessous cette réponse avant de lire la réponse, car la réponse fournie ici ne fonctionnera dans une situation spécifique si seulement 1 utilisateur au plus se connectera avec le site.

J'ai résolu le problème de la façon suivante. C'est une manière sale, mais fait l'affaire. Il passe le TempData au contrôleur et vous faites juste une liste des éléments dans le TempData.

Voir

@model IEnumerable

@{ 
    ViewBag.Title = "Cbms Home"; 

    if (TempData != null) 
    { 
     TempData.Clear(); 
    } 
    int i = 0; 
    foreach (databaseModel.cbms value in Model.ToList()) 
    { 
     i++; 
     TempData.Add(i.ToString(), value); 
    }  
} 

Contrôleur

public PartialViewResult AJX_SortByProductId() 
    {    
     //Retrieves the data 
     List<object> viewDataList = TempData.Values.ToList(); 
     TempData.Clear(); 
     List<cbms> dataList = new List<cbms>(); 
     if (viewDataList != null) 
     { 
      foreach (cbms cbmsEntry in viewDataList) 
      { 
       dataList.Add(cbmsEntry); 
      } 
     } 
     List<cbms> model = cbms.SortByProductId(dataList); 

     //Returns the partial view 
     return PartialView("_Cbms", model); 
    } 
+0

J'ai découvert que, si vous utilisez cette réponse et que vous naviguez sur le site de plusieurs façons, le cache est rafraîchi à chaque fois, ce qui n'est évidemment pas le cas, surtout lorsque vous avez besoin de plusieurs utilisateurs pour interagir avec le site Web. J'ai essayé une vérification sur le SessionID avant de vider le cache (vérifiez donc si SessionId a déjà été ajouté), mais sur le même ordinateur cela donne le même problème. Et donc, ne le résout pas. Donc, le problème n'a pas encore été résolu ... – DaGrooveNL

+0

En fait, naviguer sur le site via un navigateur différent ne crée pas de problème si vous utilisez SessionID comme identificateur ... Toujours en train de tester ... – DaGrooveNL

0

Je vois que vous utilisez Ajax.ActionLink, il est dangereux, car il va générer un lien => GET demande HTTP et ces demandes ont limitation: Get request limitations

Si vous voulez Envoyer un modèle "complexe" par Ajax, je recommande d'utiliser les requêtes POST qui n'ont pas de limitations. Je vois que vous n'avez pas de formulaires, si je comprends bien vous voulez avoir une vue avec les informations affichées & un bouton pour envoyer ces informations à l'action suivante. La seule façon de penser à cela est d'utiliser jquery ajax request & sérialisation de l'objet dans json. La sérialisation peut être faite directement dans la vue en utilisant des helpers ou JSON.NET ou vous pouvez afficher le résultat dans un tableau et obtenir vos informations en utilisant javascript.

$.ajax({ 
url : ""AJX_SortByProductId/productId", 
type: "POST", 
data : formData, //the data you want to send 
success: function(data, textStatus, jqXHR) 
{ 
    //data - response from server 
} 

});

Si vous voulez toujours utiliser @ Ajax.ActionLink, vous devez faire attention à l'URL et voir si le modèle est sérialisé correctement, le code HTML généré peut aider.

+0

Modification de la méthode à: HttpMethod = "POST" ne résout pas le problème. Les données sont actuellement affichées correctement, le problème est qu'une variable que je déclare dans la vue qui contient des données, est remplie lors de la création de la vue (elle contient donc les données), mais quand je clique sur le bouton associé à il (dans ce cas un Ajax ActionLink), la variable est vide. – DaGrooveNL

+0

Ajax.ActionLink n'est pas vraiment recommandé d'envoyer des objets complexes, et il va générer une URL, donc la propriété HttpMethod = "POST" sera inutile. J'ai sauvé ma réponse trop vite, je n'ai pas donné assez de détails. – Giu

+0

Le Ajax.ActionLink va générer une partialView, je veux juste passer une variable à une méthode dans mon contrôleur, qui passe cette variable sur une méthode dans mon modèle, qui renvoie ensuite une liste de modèle à mon contrôleur, puis redirige ce résultat à une vue partielle. Juste pour clarifier: vue (avec données)> contrôleur (données)> modèle (données)> contrôleur (données)> vue partielle. Edit: pas de problème pour enregistrer votre réponse trop vite ;-) – DaGrooveNL

Questions connexes