Les versions d'aperçu d'Asp.Net MVC 2.0 fournissent des aides comme
Html.EditorFor(c => c.propertyname)
Si le nom de la propriété est une chaîne, le code ci-dessus rend une texbox.
Que faire si je souhaite transmettre les propriétés MaxLength et Size à la zone de texte ou à ma propre propriété de classe css?
Dois-je créer un modèle pour chaque combinaison de taille et de longueur dans mon application? Si tel est le cas, cela ne rend pas les modèles par défaut utilisables.
c#
asp.net-mvc
asp.net-mvc-2
chandmk
la source
la source
J'ai résolu cela en créant un EditorTemplate nommé String.ascx dans mon dossier / Views / Shared / EditorTemplates:
À mon avis, j'utilise
Fonctionne comme un charme pour moi!
la source
Aucune des réponses de ce fil ou de tout autre fil de discussion sur la définition des attributs HTML pour @ Html.EditorFor ne m'a beaucoup aidé. Cependant, j'ai trouvé une excellente réponse à
Styliser un assistant @ Html.EditorFor
J'ai utilisé la même approche et cela a fonctionné à merveille sans écrire beaucoup de code supplémentaire. Notez que l'attribut id de la sortie html de Html.EditorFor est défini. Le code de vue
La propriété de modèle avec l'annotation des données et le formatage de la date comme "jj MMM aaaa"
A fonctionné comme un charme sans écrire beaucoup de code supplémentaire. Cette réponse utilise ASP.NET MVC 3 Razor C #.
la source
Peut-être voudra-t-il consulter l'article du blog de Kiran Chand , il utilise des métadonnées personnalisées sur le modèle de vue, telles que:
Ceci est combiné avec des modèles personnalisés qui utilisent les métadonnées. Une approche propre et simple à mon avis, mais j'aimerais voir ce cas d'utilisation courant intégré à mvc.
la source
EditorFor
en le passant commenew { htmlAttributes: { @class = "yourclass" } }
Je suis surpris que personne n'ait mentionné le passer dans "additionalViewData" et le lire de l'autre côté.
Vue (avec sauts de ligne, pour plus de clarté):
Modèle de l'éditeur:
la source
Le problème est que votre modèle peut contenir plusieurs éléments HTML, donc MVC ne saura pas auquel appliquer votre taille / classe. Vous devrez le définir vous-même.
Faites dériver votre modèle de votre propre classe appelée TextBoxViewModel:
}
Dans le modèle, vous pouvez faire ceci:
À votre avis, vous faites:
Le premier formulaire rendra le modèle par défaut pour la chaîne. Le deuxième formulaire rendra le modèle personnalisé.
La syntaxe alternative utilise une interface fluide:
}
Notez qu'au lieu de le faire dans la vue, vous pouvez également le faire dans le contrôleur, ou bien mieux dans le ViewModel:
Notez également que vous pouvez créer la classe TemplateViewModel de base - un terrain d'entente pour tous vos modèles de vue - qui contiendra un support de base pour les attributs / etc.
Mais en général, je pense que MVC v2 a besoin d'une meilleure solution. C'est toujours Beta - allez le demander ;-)
la source
Je pense que l'utilisation de CSS est la voie à suivre. J'aimerais pouvoir faire plus avec le codage .NET, comme en XAML, mais dans le navigateur, le CSS est roi.
Site.css
.cshtml
Joe
la source
EditorFor
modèle. J'utilise MVC4 et cela a très bien fonctionné.Comme dans MVC 5, si vous souhaitez ajouter des attributs, vous pouvez simplement faire
Informations trouvées sur ce blog
la source
Vous pouvez définir des attributs pour vos propriétés.
C'est ce qu'on appelle
System.ComponentModel.DataAnnotations
. Si vous ne trouvez pas ceValidationAttribute
dont vous avez besoin, vous pouvez toujours définir des attributs personnalisés.Meilleures salutations, Carlos
la source
Ce n'est peut-être pas la solution la plus astucieuse, mais elle est simple. Vous pouvez écrire une extension dans la classe HtmlHelper.EditorFor. Dans cette extension, vous pouvez fournir un paramètre d'options qui écrira les options dans ViewData pour l'assistant. Voici un code:
Tout d'abord, la méthode d'extension:
Ensuite, l'objet d'options:
Et enfin, voici la ligne du modèle String.ascx:
Franchement, je pense que c'est simple et clair pour la pauvre âme qui doit maintenir votre code sur la route. Et il est facile d'étendre à diverses autres informations que vous souhaitez transmettre à vos modèles. Cela fonctionne bien jusqu'à présent pour moi dans un projet où j'essaie d'envelopper autant que possible dans un ensemble de modèles pour aider à standardiser le HTML environnant, à la http://bradwilson.typepad.com/blog/2009/ 10 / aspnet-mvc-2-templates-part-5-master-page-templates.html .
la source
J'ai écrit une entrée de blog pour répondre à ma propre question
Ajout de la prise en charge des attributs html pour les modèles - ASP.Net MVC 2.0 Beta
la source
Je ne sais pas pourquoi cela ne fonctionne pas pour Html.EditorFor mais j'ai essayé TextBoxFor et cela a fonctionné pour moi.
... et aussi la validation fonctionne.
la source
@class = "className"
Dans ma pratique, j'ai trouvé qu'il est préférable d'utiliser EditorTemplates avec un seul HtmlHelper - TextBox dans la plupart des cas. Si je veux un modèle pour une structure html plus complexe, j'écrirai un HtmlHelper séparé.
Étant donné que nous pouvons coller tout l'objet ViewData à la place de htmlAttributes de la TextBox. De plus, nous pouvons écrire du code de personnalisation pour certaines des propriétés de ViewData si elles nécessitent un traitement spécial:
Vous trouverez ci-dessous des exemples de syntaxe dans la vue et le code HTML généré:
la source
Parce que la question est pour EditorFor not TextBoxFor, la suggestion de WEFX ne fonctionne pas.
Pour modifier des zones de saisie individuelles, vous pouvez traiter la sortie de la méthode EditorFor:
Il est également possible de changer TOUS vos EditorFors car il s'avère que MVC définit la classe des zones de texte EditorFor avec .text-box , vous pouvez donc simplement remplacer ce style, dans votre feuille de style ou sur la page.
De plus, vous pouvez définir le style pour
la source
J'ai également eu un problème avec la définition de la largeur de TextBox dans MVC3, tandis que la définition de l'attribut Clsss fonctionnait pour le contrôle TextArea mais pas pour le contrôle TextBoxFor ou EditorFor:
J'ai essayé de suivre et cela a fonctionné pour moi:
@ Html.TextBoxFor (model => model.Title, new {Class = "textBox", style = "width: 90%;"})
également dans ce cas, les validations fonctionnent parfaitement.
la source
Une façon de contourner le problème est d'avoir des délégués sur le modèle de vue pour gérer l'impression d'un rendu spécial comme celui-ci. J'ai fait cela pour une classe de pagination, j'expose une propriété publique sur le modèle
Func<int, string> RenderUrl
pour y faire face.Alors définissez comment le bit personnalisé sera écrit:
Sortez la vue de la
Paging
classe:... et pour la
Paging
vue réelle :Cela pourrait être considéré comme trop compliqué, mais j'utilise ces téléavertisseurs partout et je ne supporte pas de voir le même code standard pour les rendre.
la source
MISE À JOUR: hm, évidemment cela ne fonctionnera pas car le modèle est passé par valeur donc les attributs ne sont pas préservés; mais je laisse cette réponse comme une idée.
Une autre solution, je pense, serait d'ajouter vos propres helpers TextBox / etc, qui vérifieront vos propres attributs sur le modèle.
Celui-ci est plus facile mais pas aussi pratique / flexible.
la source
C'est le moyen le plus propre et le plus élégant / simple d'obtenir une solution ici.
Un article de blog génial et aucune surcharge de travail dans l'écriture de méthodes d'extension / d'aide personnalisées comme un professeur fou.
http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx
la source
J'ai vraiment aimé la réponse @tjeerdans qui utilise le EditorTemplate nommé String.ascx dans le dossier / Views / Shared / EditorTemplates. Cela semble être la réponse la plus simple à cette question. Cependant, je voulais un modèle utilisant la syntaxe Razor. De plus, il semble que MVC3 utilise le modèle String par défaut (voir la question StackOverflow « Le modèle d'affichage mvc pour les chaînes est utilisé pour les entiers »), vous devez donc définir le modèle sur objet plutôt que sur chaîne. Mon modèle semble fonctionner jusqu'à présent:
la source
Je l'ai résolu !!
Pour Razor, la syntaxe est la suivante:
@Html.TextAreaFor(m=>m.Address, new { style="Width:174px" })
ceci ajuste la largeur de la zone de texte à la largeur que j'ai définie dans le paramètre de style.Pour ASPx, la syntaxe est la suivante:
<%=Html.TextAreaFor(m => m.Description, new { cols = "20", rows = "15", style="Width:174px" })%>
cela fera l'affaire
la source