2011-10-11 3 views
0

J'utilise actuellement ViewBag pour transmettre un Datatable, et d'autres données dynamiques à la vue. Les données sont affichées à l'utilisateur dans une table et, selon les colonnes choisies par l'utilisateur, certains calculs sont effectués. Mon problème est, ces calculs doivent être enchaînés, de sorte que lorsque l'utilisateur effectue un calcul, l'état des données est maintenu, et d'autres calculs sur ces données sont alors possibles.ASP.net mvc3 Obtenir des données de View to Controller C#

Comment puis-je obtenir à chaque fois l'état de données actuel de la vue dans le contrôleur? Les calculs doivent être effectués sur cet état actuel. Si cela fait une différence, je pourrais facilement changer la vue en une vue fortement typée, et créer un nouvel objet pour abstraire la datatable et les autres données dynamiques.

Tout conseil est le bienvenu.

Merci.

Répondre

0

Cela me semble AJAX. Vous devriez pouvoir renvoyer l'état au serveur (une autre méthode dans votre contrôleur) et le stocker comme vous le souhaitez. MVC3 a quelques bons trucs JSON qui devraient vous faciliter la vie. Que + jQuery, vous devriez rire.

0

Je vous encourage à éviter DataTables et DataSets si possible. Ils devraient être considérés comme la pire sorte de DTO puisque vous ne pouvez jamais garantir ce qu'ils contiennent et quand (sauf si vous suivez la chaîne d'appel jusqu'à leur origine et assurez-vous qu'ils ne sont pas changés n'importe où sur le chemin). En utilisant des modèles de vue appropriés, vous savez ce qu'ils contiennent en les regardant simplement, et vous pouvez également mettre toute la logique de formatage à l'intérieur d'eux plutôt que dans la vue.

J'ai écrit une entrée de blog pourquoi vous devriez utiliser des modèles de vue: http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

Quant à votre question: Le plus simple est d'utiliser jQuery/Ajax et le retour JSON (ce qui est facile si vous utilisez bon voir les modèles).

<script type="text/javascript"> 
$(function() { //<-- runs the script when the document has been loaded 

    $('#formid').submit(function() { // <--- hook form submit event 

     $.post('@Html.Action("CalcOne")?option='+ $('#id').val(), function(data) { 
      var result = data.result; 
      $.post('@Html.Action("CalcTwo")?option='+ result, function(data) { 
        //do third calc 
      }); 
     }); 
    }); 
}); 
</script> 

Et dans votre contrôleur:

[HttpPost] 
public ActionResult CalcOne(int option) 
{ 
    //do some calculations 
    return Json(new MyModel{ Result = option + 1 }); 
} 
+0

Merci pour la réponse, et je suis d'accord, je ne l'utilise généralement ViewModels. Cependant, dans ce cas, les données stockées dans la base de données et affichées à l'utilisateur ne peuvent pas être facilement encapsulées dans une machine virtuelle. Les colonnes peuvent varier considérablement, en fonction de ce que l'utilisateur sélectionne et de ce qu'il choisit de faire pivoter ou de calculer. C'est pourquoi j'ai choisi un DT dans ce cas. –

+0

La réponse s'applique toujours. Vous devez utiliser quelque chose comme l'exemple – jgauffin

Questions connexes