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 unDictionary<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à unDictionary<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.
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien, vous essayez d'effectuer une itération sur les propriétés d'un type anonyme. Si oui: Comment puis-je effectuer une itération sur les propriétés d'un objet anonyme en C#?
[Modifier]
Ok, c'est plus que ça. C'est vraiment me dérange maintenant parce que j'aime C# et il ne me laisse pas faire ce que Python n', que j'aime également. Voici donc une solution, si vous êtes à l'aide de C# 4, mais c'est salissant et de travail pour un problème similaire que j'ai, mais peut-être pas exactement pour vous:
Il y a ai être une meilleure façon.
dans mon cas, j'ai un éditeur pour un champ booléen que je veux être un oui/non, radio. J'utilise le additionalViewData de propriété pour définir le texte de oui/non localisés. Semble fonctionner à merveille pour moi!
Voici le code de mon personnalisée editorFor:
Voici comment vous appelez cette coutume EditorFor:
Avez-vous essayé simplement d'ajouter les données à
La ViewData collection est une collection mondiale de la ViewContext donc, je pense l'ajouter à la global ViewData va mettre à la disposition quand le EditorTemplate est rendu.
PLUS d'INFO: Comme je le comprends, le additionalViewdata propriété est juste un moyen facile d'ajouter une collection/tout pour le mondial ViewData à la volée après que vous avez décidé de contrôle pour le rendu. Utilise toujours la même contextuel de la collection et ce ne sont pas tellement différentes de l'objet en tant que fin et moyen propre pour l'ajouter à le même contexte dictionnaire.
Je n'ai pas essayé encore, donc, si je suis à côté de la question, dites-le et je vais juste supprimer la réponse.
La RouteValueDictionary utilise le TypeDescriptor de l'infrastructure (
TypeDescriptor.GetProperties(obj)
) afin de refléter l'additionalViewData objet. Que cette infrastructure est extensible, vous pouvez créer une classe qui implémente l'ICustomTypeDescriptor et fournit de faux propriétés de votre choix, par exemple basée sur un dictionnaire interne.Dans l'article suivant, vous trouverez une mise en œuvre: http://social.msdn.microsoft.com/Forums/en/wpf/thread/027cb000-996e-46eb-9ebf-9c41b07d5daa
Avoir cette application, vous pouvez facilement ajouter des "propriétés" avec le nom arbitraire et de la valeur et de le transmettre comme l'addtionalViewData objet. Pour obtenir les propriétés existantes de l'objet initial, vous pouvez utiliser la même méthode que MVC ferai plus tard, appel de la TypeDescriptor.GetProperties, énumérer les propriétés et obtenir le nom et la valeur de la propriété, et de les ajouter à votre nouvel "objet" ainsi.
Un peu en retard, mais il y a une solution qui fonctionne à l'aide de CodeDom disponible ici.
Utilisation:
Grâce à l'originalité de l'auteur, Anthony Johnston!