47 votes

Puis-je transmettre un type anonyme à ma vue ASP.NET MVC?

J'ai juste commencé à travailler avec ASP.NET MVC maintenant qu'il est en version bêta. Dans mon code, je suis à court d'un simple LINQ to SQL de la requête pour obtenir une liste de résultats et de passage que de mon point de vue. Ce genre de chose:

var ords = from o in db.Orders
           where o.OrderDate == DateTime.Today
           select o;

return View(ords);

Cependant, de mon point de Vue, j'ai réalisé que j'avais besoin d'accéder au nom du client pour chaque commande. J'ai commencé à utiliser o.Customer.Name mais je suis assez certain que c'est l'exécution d'une requête distincte pour chaque commande (en raison de LINQ du lazy loading).

La logique de réduction du nombre de requêtes, serait de choisir le nom du client en même temps. Quelque chose comme:

var ords = from o in db.Orders
           from c in db.Customers
           where o.OrderDate == DateTime.Today
               and o.CustomerID == c.CustomerID
           select new { o.OrderID, /* ... */, c.CustomerName };

return View(ords);

Sauf que maintenant mon "ords" variable est un IEnumerable d'un type anonyme.

Est-il possible de déclarer un ASP.NET MVC Vue de telle manière qu'elle accepte un IEnumerable que son affichage de données où T est défini par ce qui est transmis par le contrôleur, ou devrai-je définir un type de béton à remplir à partir de ma requête?

26voto

Haacked Points 31070

Vous pouvez passer à la vue? Oui, mais votre point de vue ne sera pas fortement typé. Mais les aides de travail. Par exemple:

public ActionResult Foo() {
  return View(new {Something="Hey, it worked!"});
}

//Using a normal ViewPage

<%= Html.TextBox("Something") %>

Que la zone de texte doit rendre "Hey, ça a fonctionné!" comme valeur.

Vous pouvez donc définir une vue où T est défini par ce qui est transmis à partir du contrôleur? Eh bien oui, mais pas au moment de la compilation évidemment.

Pensez-y un instant. Lorsque vous déclarez un modèle de type de vue, c'est donc vous, intellisense pour la vue. Cela signifie que le type doit être déterminé au moment de la compilation. Mais la question se pose, peut-on déterminer le type de quelque chose qui est donné au moment de l'exécution. Oui, mais pas avec un typage fort préservé.

Comment voulez-vous obtenir de l'Intellisense pour un type que vous ne connaissez même pas encore? Le contrôleur pourrait passer n'importe quel type de la vue alors que lors de l'exécution. Nous ne pouvons même pas analyser le code et de le deviner, parce que l'action des filtres pourrait changer l'objet passé à la vue de tout ce que nous savons.

J'espère que le précise la réponse sans obscurcir davantage. :)

16voto

Lasse Dahl Ebert Points 1310

Vous pouvez passer des types anonymes à une vue, n'oubliez pas de convertir le modèle en dynamique.

Vous pouvez faire comme ça:

 return View(new { 
    MyItem = "Hello", 
    SomethingElse = 42, 
    Third = new MyClass(42, "Yes") })
 

En haut de la vue, vous pouvez ensuite le faire (en utilisant le rasoir ici)

 @{
    string myItem = (dynamic)Model.MyItem;
    int somethingElse = (dynamic)Model.SomethingElse;
    MyClass third = (dynamic)Model.Third;
}
 

Ou vous pouvez les caster à partir des ViewData comme ceci:

 @{
    var myItem = ViewData.Eval("MyItem") as string
    var somethingElse = ViewData.Eval("SomethingElse") as int?
    var third = ViewData.Eval("Third") as MyClass 
}
 

8voto

DotNetWise Points 2237

Sur .NET 4.0, les types anonymes peuvent facilement être convertis en ExpandoObjects et donc tous les problèmes sont résolus avec la surcharge de la conversion elle-même. Découvrez ici

4voto

Matt Hamilton Points 98268

Pour ce que ça vaut, ce soir, j'ai découvert la classe DataLoadOptions et sa méthode LoadWith . J'ai pu dire à mon LINQ to SQL DataContext de toujours charger une ligne Customers chaque fois qu'une ligne Orders est récupérée, de sorte que la requête d'origine obtient maintenant tout ce dont j'ai besoin en une seule fois.

4voto

Raja Points 21

Voici un article expliquant comment passer du type anonyme aux vues et lier les données.

Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X