Pourquoi ne puis-je pas transmettre d'attributs html à EditorFor()
? par exemple;
<%= Html.EditorFor(model => model.Control.PeriodType,
new { disabled = "disabled", readonly = "readonly" }) %>
Je ne veux pas utiliser de métadonnées
Mise à jour : la solution était d'appeler ceci depuis la vue:
<%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>
et utiliser ViewData["Modifiable"]
dans mon EditorTemplates / String.ascx personnalisé où j'ai une logique de vue qui détermine s'il faut ajouter des attributs en lecture seule et / ou désactivés à l'entrée.L'objet anonyme transmis EditorFor()
est un paramètre appelé additionalViewData
et ses propriétés sont transmises au modèle d'éditeur dans le ViewData
collection.
html
asp.net-mvc
editorfor
Typo Johnson
la source
la source
Réponses:
EditorFor
fonctionne avec les métadonnées, donc si vous souhaitez ajouter des attributs html, vous pouvez toujours le faire . Une autre option consiste simplement à écrire un modèle personnalisé et à utiliserTextBoxFor
:la source
PeriodType
? N'est-ce pas une simple propriété? S'il s'agit d'un objet complexe, vous pouvez personnaliser l'ensemble du modèle en plaçant un partiel dans~/Views/ControllerName/EditorTemplates/SomeType.ascx
où seSomeType
trouve le nom de type de laPeriodType
propriété.@class
un modèle d'éditeur contenant 3 div par exemple. L'assistant Html.TextBoxFor vous permet de définir cela parce que vous savez ce que cet assistant génère - une zone de texte, il est donc logique de définir une classe sur un élément d'entrée.La mise à jour MVC 5.1 prend désormais directement en charge l'approche ci-dessous, elle fonctionne donc également pour l'éditeur intégré. http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features (C'est soit un cas de Great mind pensant de la même manière, soit ils lisent ma réponse :)
Mettre fin à la mise à jour
Si vous utilisez votre propre modèle d'éditeur ou avec MVC 5.1 qui prend désormais en charge l'approche ci-dessous directement pour les éditeurs intégrés.
puis dans votre modèle (non requis pour les types simples dans MVC 5.1)
la source
À partir de MVC 5.1, vous pouvez désormais effectuer les opérations suivantes:
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features
la source
EditorFor
modèles intégrés / par défaut . Si vous implémentez la vôtre, vous devez suivre la réponse d'AntonK.Maintenant, ASP.Net MVC 5.1 a un support intégré pour cela.
À partir des notes de version
Par exemple:
la source
Voici la syntaxe du code VB.Net pour les attributs html dans MVC 5.1 Editor
la source
Pourquoi ne pas simplement utiliser
la source
Si vous ne souhaitez pas utiliser de métadonnées, vous pouvez utiliser un
[UIHint("PeriodType")]
attribut pour décorer la propriété ou s'il s'agit d'un type complexe, vous n'avez rien à décorer. EditorFor recherchera ensuite un fichier PeriodType.aspx ou ascx dans le dossier EditorTemplates et l'utilisera à la place.la source
Je suis aux prises avec le même problème aujourd'hui pour une case à cocher qui se lie à un bool nullable, et comme 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 cela devrait fonctionner dans 99% des cas que je pourrais rencontrer. Vous auriez évidemment à faire un remplissage manuel des attributs valides pour chaque type d'entrée, mais je pense que je les ai tous cochés.
Dans mon modèle d'éditeur Boolean.cshtml:
la source
Dictionary<string,string> attribs = new Dictionary<string,string>();
etattribs.Add("tabindex","16");
dans l'un de ces@( )
blocs en haut de ma page. Ensuite, je l'ai fait@Html.CheckBox("IsActive", Model.IsActive.HasValue ? Model.IsActive : false, attribs)
sur ma page et cela me donne une erreur: "'System.Web.Mvc.HtmlHelper <MyProject.Models.MyObject>' ne contient pas de définition pour 'CheckBox' et la meilleure surcharge de méthode d'extension 'System.Web. Mvc.InputExtensions.CheckBox (System.Web.Mvc.HtmlHelper, string.bool, object) 'a des arguments non valides ".Vous pouvez toujours utiliser EditorFor. Passez simplement l'attribut style / n'importe quel attribut html en tant que ViewData.
Étant donné que EditorFor utilise des modèles pour le rendu, vous pouvez remplacer le modèle par défaut de votre propriété et simplement transmettre l'attribut de style en tant que ViewData.
Ainsi, votre EditorTemplate aimerait ce qui suit:
la source
vous pouvez utiliser comme ça; même sortie avec
Html.EditorFor
, et vous pouvez ajouter vos attributs htmlla source
TextBoxFor
ignore tout type de ceDisplayFormat
que vous essayez d'appliquer.Créez simplement votre propre modèle pour le type dans Views / Shared / EditorTemplates / MyTypeEditor.vbhtml
Appelez l'éditeur depuis votre vue avec la propriété model:
Pardonnez la syntaxe VB. C'est comme ça que nous roulons.
la source
Dans mon cas, j'essayais de créer un modèle d'éditeur d'entrée de numéro HTML5 qui pourrait recevoir des attributs supplémentaires. Une approche plus soignée serait d'écrire votre propre HTML Helper, mais comme j'avais déjà mon modèle .ascx, j'ai opté pour cette approche:
Cet horrible bit crée une entrée de type numérique et recherche un dictionnaire ViewData avec la clé «attributs». Il parcourra le dictionnaire en ajoutant ses paires clé / valeur en tant qu'attributs. Le Regex dans l'attribut ID n'est pas lié et existe car lorsqu'il est utilisé dans une collection,
GetFullHtmlFieldId()
renvoie un identifiant contenant des crochets[]
qu'il échapperait normalement sous forme de traits de soulignement.Ce modèle est alors appelé comme ceci:
Verbose, mais ça marche. Vous pouvez probablement utiliser la réflexion dans le modèle pour utiliser des noms de propriétés comme noms d'attributs au lieu d'utiliser un dictionnaire.
la source
Définissez la condition à l'aide
ViewData
du contrôleurEnsuite, utilisez ce modèle viewdata dans l'éditeur pour définir l'attribut html du contrôle
la source
MVC 5.1 et une solution supérieure (fusionnera les HtmlAttributes locaux et définis dans les EditorTemplates):
Shared \ EditorTemplates \ String.cshtml:
Extensions:
Usage:
la source
source1
et ensource2
tant queIDictionary<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); }