J'essaie de générer un contrôle complexe utilisé dans mon site Web, mais avec différents domaines. La fonctionnalité du contrôle est toujours la même, ce sont les champs sous-jacents qui changent.
Pour obtenir la méthode de montrer différents champs, je tente de créer une extension HTMLHelper qui accepte une expression la vue: p> C'est l'extension que je rencontre des problèmes - Comment puis-je itération sur les paramètres fournis dans la Lambda à Fournissez chacun avec un L'extension dans PSEDEDO: P>
textboxfor () code>, ou même créer manuellement une entrée
d'entrée code> et le peupler avec la valeur code> code> et
nom code > du paramètre Lambda? p>
public static MvcHtmlString MyHelper<TModel,TProperty>(
this HtmlHelper<TModel> helper,
Expression<Func<TModel,TProperty>> expression) {
foreach (var parameter in expression.???) {
// helper.TextBoxFor(???)
// TagBuilder("input").Attributes("name", expression.???)
}
}
4 Réponses :
L'expression que vous aurez créé sera relativement compliquée - cela nécessitera de récupérer toutes les propriétés, puis d'appeler le constructeur de type anonyme. "Démontage" qui peut devenir douloureux ... Bien que si vous voulez toujours essayer, je suggérerais de laisser une implémentation de méthode vide et de regarder dans le débogueur pour voir à quoi ressemble l'expression.
Si vous seriez heureux. Pour vous contenter d'une forme légèrement laidienne de code d'appel, il serait beaucoup em> plus simple à implémenter ceci: p> vous pouvez faire qui prendra un paramètres expression
// Overload for one property
MyHelper<TModel, TProperty1>(this ..., Expression<Func<TModel, TProperty1>> func1)
// Overload for two properties
MyHelper<TModel, TProperty1, TProperty2>(this ...,
Expression<Func<TModel, TProperty1>> func1,
Expression<Func<TModel, TProperty2>> func2)
J'avais envisagé cette approche, mais comme vous le dites que c'est un peu disgracieux, je vais le garder comme un «plan B». :) Merci d'avoir répondu, Jon.
Si vous supposez ce qui suit:
mémorexpressions code> et ne contiennent pas d'appel à une méthode sur le modèle ou sur ses enfants li>
ol> alors vous pouvez réaliser ce que vous voulez en utilisant l'approche suivante: p>
EDIT: strong> p> Après avoir réalisé que mon premier exemple pourrait Ne manipulez pas les objets avec des propriétés complexes, j'ai mis à jour le code pour utiliser une méthode d'assistance pour accéder aux valeurs de propriété. Cette méthode traverse la chaîne de propriétés à l'aide de la récursivité pour renvoyer les valeurs appropriées. P> xxx pré> Note: strong> Je n'ai pas implémenté cela directement sous forme de méthode d'extension MVC Dans mon IDE, une légère variation de la syntaxe peut être nécessaire. p> p>
Peut-être une API de style constructeur pourrait simplifier les choses: Notez que cela vous permet d'ajouter des paramètres facultatifs au cas où vous en auriez besoin. P> Le code regarderait quelque chose comme ça p>
Considérez ceci:
Créer un dossier App_code P>
Mettez le fichier d'aide de rasoir Templates.cshtml. p>
On dirait ci-dessous: p> De cette façon, vous n'avez pas à écrire HTML dans les fichiers C #. C'est très pratique. P> auteurs.cshtml ressemble au dessous: p> books.cshtml ressemble au dessous: p> Plugin toutes les propriétés spéciales à mesure que vous avez besoin par classe de modèle. Si cela devient trop compliqué, examinez l'objet dynamique et expando. Cela dépend de la complexité de vos modèles / formes de vue. P> p>
Après avoir réaffecté la question et ma réponse, j'ai réalisé que mon premier exemple ne pouvait pas gérer d'accéder à des valeurs de propriétés complexes sur le modèle. J'ai mis à jour mon exemple de code pour tenir compte de cette situation.