Les attributs Html pour EditorFor() dans ASP.NET MVC
Pourquoi ne puis-je pas passer dans les attributs html pour EditorFor()
? par exemple;
<%= Html.EditorFor(model => model.Control.PeriodType,
new { disabled = "disabled", readonly = "readonly" }) %>
Je ne veux pas utiliser les métadonnées
Mise à jour: La solution a été d'appeler cela de la vue :
<%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>
et l'utilisation ViewData["Modifiable"]
dans mon custom EditorTemplates/Chaîne.ascx où j'ai une certaine logique de vue qui détermine s'il convient d'ajouter readonly et/ou handicapées attributs à l'entrée
L'anonyme de l'objet passé en EditorFor()
est un paramètre appelé additionalViewData
et ses propriétés sont transmises à l'éditeur de modèle dans le ViewData
collection.
- Sérieusement, encore dans MVC3 cette limitation n'a pas de sens et c'est vraiment gênant. Les gens du monde entier sont les dépenses de temps et de tirer leurs cheveux avec ce non-sens. Je vous envoie ce de Microsoft Connect.
- connect.microsoft.com/VisualStudio/feedback/details/764012/...
- Est-ce juste moi, ou est-ce que semblent comme beaucoup de bs pour quelque chose qui devrait être tellement simple?
- Peut-être que ce sera vous aider à: [EditorFor-mise en Œuvre avec les classes CSS et attributs HTML][1] [1]: stackoverflow.com/questions/12675708/...
- Double Possible de EditorFor() et les propriétés html
Vous devez vous connecter pour publier un commentaire.
EditorFor
travaille avec des métadonnées, donc si vous voulez ajouter des attributs html vous on pourrait toujours le faire. Une autre option est de simplement écrire un modèle personnalisé et l'utilisationTextBoxFor
:PeriodType
? N'est-il pas une simple propriété? Si c'est un objet complexe, vous pourriez peut personnaliser l'ensemble du modèle en plaçant un partiel dans~/Views/ControllerName/EditorTemplates/SomeType.ascx
oùSomeType
est le nom du type de laPeriodType
de la propriété.@class
pour un éditeur de modèle qui contient 3 divs par exemple. Le Html.TextBoxFor aide vous permet de définir ce parce que vous savez ce que cette aide ne génère une zone de texte, donc il est logique de définir une classe à un élément d'entrée.EditorFor
avait pas de modèle à chercher. La possibilité de mieux gérer les attributs html serait plus agréable en évitant les solutions de contournement que nous voyons aujourd'hui dans internet. Imaginez un helper:EditorFor(m=>m.YourField, renderAsSingleInput, htmlAttributesHere)
, qui permettrait de gagner du temps pour les personnes qui ont besoin de coller avec EditorFor méthodes.Mise à jour MVC 5.1 prend désormais en charge le ci-dessous approche directement, de sorte qu'il fonctionne pour les construit dans l'éditeur de trop. http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features
(Il s'agit soit d'un cas de Grand esprit de penser ou ils ont lu ma réponse 🙂
Mise À Jour De Fin
Si vous utilisez votre propre éditeur de modèle ou avec MVC 5.1 qui prend désormais en charge le ci-dessous approche directement intégrés dans les éditeurs.
puis dans votre modèle (non requis pour les types simples MVC 5.1)
Comme de la MVC 5.1, vous pouvez maintenant effectuer les opérations suivantes:
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features
EditorFor
modèles. Si vous implémentez votre propre, vous devez suivre AntonK de réponse.Maintenant ASP.Net MVC 5.1 a un support intégré pour elle.
À Partir De Notes De Publication
Par exemple:
Ici est la VB.Net code syntaxe pour attributs html MVC 5.1 EditorFor
Pourquoi ne pas simplement utiliser
Si vous ne souhaitez pas utiliser des Métadonnées, vous pouvez utiliser un
[UIHint("PeriodType")]
attribut pour décorer la propriété ou si c'est un type complexe vous n'avez pas à décorer n'importe quoi. EditorFor va ensuite chercher une PeriodType.aspx ou fichier ascx dans le EditorTemplates dossier et de l'utiliser à la place.Vous pouvez toujours utiliser EditorFor. Il suffit de passer le style/selon l'attribut html comme ViewData.
Parce que EditorFor utilise des modèles pour le rendu, vous pourriez remplacer le modèle par défaut pour votre propriété et de passer simplement l'attribut de style comme ViewData.
De sorte que votre EditorTemplate serait comme suit:
vous pouvez l'utiliser comme cela ; même sortie avec
Html.EditorFor
,et vous pouvez ajouter vos attributs htmlTextBoxFor
ignore tout type deDisplayFormat
que vous tentez peut-être de s'appliquer.J'ai été confronté au même problème aujourd'hui pour une case à cocher qui se lie à un nullable bool, et depuis je ne peux pas changer mon modèle (pas mon code), j'ai dû trouver une meilleure façon de gérer cela. C'est un peu la force brute, mais il doit travailler pour 99% des cas je pourrais rencontrer. Vous feriez bien évidemment devoir faire un peu de remplissage manuel des attributs valides pour chaque type d'entrée, mais je pense que j'ai obtenu tous les de la case.
Dans mon Booléen.cshtml éditeur de modèle:
Dictionary<string,string> attribs = new Dictionary<string,string>();
etattribs.Add("tabindex","16");
dans l'un de ces@( )
blocs en haut de ma page. Alors je n'ai@Html.CheckBox("IsActive", Model.IsActive.HasValue ? Model.IsActive : false, attribs)
sur ma page et il me donne une erreur: "'Système.Web.Mvc.HtmlHelper<MyProject.Modèles.Monobjet>' ne contient pas une définition pour 'Case à cocher' et la meilleure méthode d'extension de surcharge du Système".Web.Mvc.InputExtensions.Checkbox(Case À Cocher Système.Web.Mvc.HtmlHelper, chaîne.bool, objet)' a certains arguments non valides".Tout simplement créer votre propre modèle pour le type de Views/Shared/EditorTemplates/MyTypeEditor.vbhtml
Invoquer l'éditeur à partir de votre point de vue avec le modèle de la propriété:
Pardon la syntaxe VB. C'est juste notre façon de faire.
Dans mon cas, j'ai essayé de créer un HTML5 nombre d'entrée de l'éditeur de modèle qui pourrait recevoir des attributs supplémentaires. Un plus propre approche serait d'écrire votre propre Helper HTML, mais comme j'ai déjà eu mes .ascx modèle, je suis allé avec cette approche:
Ce vilain bits crée un certain nombre type d'entrée et de recherche un ViewData Dictionnaire avec la touche "attributs". Il va parcourir le dictionnaire de l'ajout de ses paires clé/valeur en tant qu'attributs. La Regex dans l'attribut ID est indépendante et est là parce que lorsqu'utilisé dans une collection,
GetFullHtmlFieldId()
retourne un id contenant des crochets[]
laquelle il devrait normalement s'échapper des traits de soulignement.Ce modèle est ensuite appelée comme ceci:
Verbeux, mais il fonctionne. Vous pourriez probablement utiliser la réflexion dans le modèle d'utilisation de la propriété des noms comme noms d'attribut au lieu d'utiliser un dictionnaire.
Définir la condition à l'aide de
ViewData
dans le contrôleurEnsuite utiliser cette viewdata dans l'éditeur de modèle pour définir l'attribut html de contrôle
MVC 5.1 et supérieur, solution (de la fusion locale HtmlAttributes et définis dans le EditorTemplates):
Shared\EditorTemplates\String.cshtml:
Extensions:
Utilisation:
source1
etsource2
commeIDictionary<string, object>
. J'ai fait cette fonction:private static IDictionary<string, object> ToHtmlAttributesDictionary(this IEnumerable<KeyValuePair<string, object>> dico) { return dico.ToDictionary(s => s.Key.Replace('_', '-'), s => s.Value); }