ASP.Net MVC: Html.Affichage() pour un objet dans une Collection

La norme MVC exemple de dessiner un élément avec la Vue du Modèle est:

Html.Méthode displayfor(m => m.Date)

Si le Modèle objet possède une propriété appelée Date de type DateTime, cela renvoie une chaîne de caractères avec le HTML à partir de l'Écran/DateTime.ascx modèle.

Supposons que vous vouliez faire la même chose, mais je ne pouvais pas utiliser le typage fort de la version que vous ne connaissez pas le Modèle type de ce point de Vue au moment de la compilation. Vous utilisez le plus:

Html.Afficher("Date");

Voici donc la partie la plus difficile.

Supposons que le Modèle est IEnumerable. Vous ne savez pas ce que ces objets sont à la compilation, mais au moment de l'exécution, ils se trouvent être des objets avec une Date de type DateTime de nouveau, comme:

public class ModelClass
{
    public DateTime Date { get; set; }
}

Maintenant, supposons que vous voulez que votre Vue pour itérer sur les objets et le rendu de chaque. Si tout vous vous souciez de la valeur que vous pourriez faire ceci:

<%
StringBuilder sb = new StringBuilder();
foreach(object obj in (IEnumerable<object>)Model)
{
    Type type = obj.GetType();

    foreach(PropertyInfo prop in type.GetProperties())
    {
        //TODO: Draw the appropriate Display PartialView/Template instead
        sb.AppendLine(prop.GetValue(obj, null).ToString());
    }
}
%>
<%= sb.ToString() %>

Je suis évidemment en prenant quelques raccourcis pour garder cet exemple concentré.

Ici est le point - comment puis-je répondre que TODO que j'ai écrit pour moi-même? Je ne veux pas d'obtenir la valeur - je veux la faire bien mis en forme comme le Html.Afficher("Date"). Mais si je viens de l'appeler Html.Afficher("Date"), il inspecte le Modèle, qui est un IEnumerable, une propriété nommée Date, ce qui bien sûr n'a pas. Html.L'affichage ne prend pas un objet comme un argument à utiliser comme Modèle (comme le Html.Affichage(obj, "Date"), et toutes les classes et les méthodes que je peux trouver qui se trouvent en dessous semblent être à l'intérieur je ne peux pas les modifier et de les appeler directement.

Il doit y avoir un moyen simple pour accomplir ce que je suis en train de faire, mais je n'arrive pas à le trouver.

Juste pour faire sûr que je suis d'être clair, voici un exemple du code de DateTime.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%= Model.ToString("MM/dd/yyyy") %>

Et donc, idéalement, la sortie de ce point de Vue qui peut prendre n'importe quel Modèle, mais dans ce cas, une liste de 3 de ces ModelClass objets ci-dessus serait:

11/10/2001
11/10/2002
11/10/2003

Parce que le code ne trouvez que l'Affichage PartialView pour le type DateTime et de la rendre appropriée pour chaque.

Soi - comment puis-je accomplir la tâche?

OriginalL'auteur Chris Moschini | 2010-10-19