EditorFor() et additionalViewData: comment faire pour ajouter des données dans la classe helper?

EditorFor() peut prendre un object additionalViewData paramètre de la méthode classique pour peupler est quelque chose comme:

EditorFor(model => model.PropertyName, new { myKey = "myValue" })

Comment puis-je vérifier le contenu des additionalViewData, ajouter ou ajouter à une valeur pour une clé, etc personnalisé dans un Helper HTML?

J'ai essayé ces approches:

  • convertir Dictionary<string, object>() et ajouter/ajouter des valeurs: ne fonctionne pas comme il ressemble à la mise en œuvre de EditorFor MVC utilise de nouveaux RouteValueDictionary(additionalViewData) qui intègre le dictionnaire dans un dictionnaire
  • convertir RouteValueDictionary à l'aide de new RouteValueDictionary(additionalViewData) mais qui est identique (ou très similaire) question ci-dessus

Je suis également ouvert à "vous faites mal" -- peut-être que je vais manquer une approche plus simple. Gardez à l'esprit ce que j'essaie de faire est d'écrire un helper HTML qui est réutilisable et ajoute quelques valeurs de la additionalViewData pour être utilisé par des vues personnalisées. Certaines de ces valeurs dépendent de métadonnées à partir de la propriété de sorte qu'il n'est pas tout à fait aussi facile que de simplement utiliser un tas de modèles différents.

Mise à jour avec l'exemple de ce que je fais:

    public static MvcHtmlString myNullableBooleanFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> choice, string templateName, object additionalViewData)
    {            
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(choice, htmlHelper.ViewData);

        /*
    here need to add to additionalViewData some key values among them:
    { propertyName, metadata.PropertyName }

     */

        StringBuilder sb = new StringBuilder();
        sb.AppendLine(htmlHelper.EditorFor(choice, templateName, additionalViewData).ToString());
        MvcHtmlString validation = htmlHelper.ValidationMessageFor(choice);
        if (validation != null)
            sb.AppendLine(validation.ToString());
        return new MvcHtmlString(sb.ToString());
    }

Mise à jour avec ce qui se passe quand je convertir l'objet anonyme à un Dictionary<string, object>() et passer ce dictionnaire EditorFor():

J'ai mis un point de rupture dans le Rasoir vue et examinée ViewData. Il semble que le dictionnaire est passé dans EditorFor() est mis à l'intérieur un autre Dictionary<string, object>(). Dans la "Fenêtre", ViewData ressemble à ceci:

ViewData.Keys
Count = 4
    [0]: "Comparer"
    [1]: "Count"
    [2]: "Keys"
    [3]: "Values"

Voir comment le dictionnaire le contenu d'un dictionnaire à l'intérieur de ça? Oui, les données réelles sont en centre de dictionnaire toutefois sans surprise, cela ne fonctionne pas.

Ajouté prime.

  • Les sons que vous ne l'êtes pas écrire un HtmlHelper à tous. Pourriez-vous expliquer plus en détail ce que sont vos objectifs?
  • J'ai ajouté un exemple -- c'est un helper HTML qui rend l'utilisation de EditorFor de sorte que l'appelant peut spécifier le modèle. Similaire au code source pour TextBoxFor() ou autres assistances HTML.
  • J'ai trouvé une autre façon de faire (de redescendre à RadioButtonFor()) comme je n'ai plus besoin de remplacer certains de la sortie HTML. Donc je dirais que l'exemple est un exemple, mais pas quelque chose que j'avais utiliser. Je suis toujours curieux de savoir si l'ajout, la suppression et le remplacement de valeurs dans additionalViewData dans le code HTML helpers est une approche réaliste.
  • Avez-vous été en mesure de convertir l'objet de Dictionary<string, object> ou pas? Je ne peux pas vraiment dire
  • J'ai été en mesure de convertir l'objet de Dictionary<string, object> sans problème cependant lorsque l'objet est transmis à EditorFor() et alors émise à la vue (utilisé de Rasoir, mettre dans un certain code et l'a attrapé avec le débogueur) il est émis de manière incorrecte: c'est un Dictionary<string, object>() ce qui est correct, cependant, que le dictionnaire les dictionnaire nous voulons à l'intérieur. Ma conjecture est le code dans EditorFor peut pas dire que c'est déjà un Dictionary<string, object>() et re-dictionnaires de nouveau. J'ai mis une mise à jour au bas de ma question avec plus de détails sur cette affaire.
InformationsquelleAutor Cymen | 2011-06-09