ASP.NET MVC 3: remplacer l'attribut «nom» par TextBoxFor

99

Est-il possible lors de l'utilisation Html.TextBoxForde remplacer l'attribut de nom?

J'ai essayé sans succès. Je dois utiliser TextBoxFor pour que la validation côté client fonctionne, mais pour des raisons que je n'entrerai pas, j'ai besoin que le nom de la zone de texte soit différent de celui généré.

J'ai essayé ce qui suit:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

Ce qui fonctionne pour l'ID mais pas pour le nom. Est-ce possible?

Mise à jour : recherche dans le code de TextBoxFor. Il ne semble pas qu'il existe un moyen facile. J'espère que quelqu'un pourra me prouver le contraire.

Rob Stevenson-Leggett
la source
Quel est le type de données de 'Données'
Archil
2
Ces questions demandent quelque chose de légèrement différent. Aussi - c'est le plus ancien des trois, donc je pense que vous voulez dire dupliqué par.
Rob Stevenson-Leggett

Réponses:

234

Rob, en fait, il existe un moyen beaucoup plus simple. Au lieu du nom , utilisez Nom :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })
Anar Khalilov
la source
11
Sensible à la casse, c'est @highwingers, ce petit détail a le potentiel de gagner des heures.
anar khalilov
3
Overkill .. Nom mais id X_X
Vladimirs
2
Bizarre, "id" n'est pas sensible à la casse (fonctionne bien avec Id et id) mais "name" ne l'est pas.
Vladimirs
10
Avec ASP.NET 4, fournir des Namerésultats dans deux attributs Nameet name, et le classeur de modèles utilise le name.
GSerg
1
Mais gérer deux propriétés différentes dont les noms ne diffèrent que par cas est une recette pour un cauchemar de maintenance .....
James McCormack
41

Le demandez-vous parce que vous souhaitez appliquer un préfixe au nom? Si tel est le cas, vous pouvez le faire en définissant ViewData.TemplateInfo.HtmlFieldPrefixdans votre contrôleur.

J'ai beaucoup appris sur ce sujet sur le blog de Brad Wilson .

James McCormack
la source
Cela ressemble au gagnant! Belle.
Rob Stevenson-Leggett
2
Ouais, ils ont bien caché celui-là, n'est-ce pas :)
James McCormack
Cela m'a évité quelques maux de tête et la duplication de code.
davidXYZ
13

EditorFor a une surcharge où vous pouvez fournir l' nameattribut en tant que paramètre:

 @Html.EditorFor(expression, null, name)
Protecteur un
la source
1
M'aurait fait gagner des heures si j'avais trouvé cela il y a des heures, haha
Johnie Karr
Intéressant, mais il n'y a pas de surcharge pour l'attribut name pour des helpers similaires comme DropDownListFor, vous devez le spécifier dans le paramètre d'attributs html (avec un N majuscule dans Name).
nmit026
8

Essayez EditorFor . vous pouvez passer une chaîne comme nom de modèle si vous souhaitez vous assurer que la zone de texte est rendue même si le type de propriété n'est pas une chaîne. Si la propriété est déjà une chaîne, elle n'a pas besoin templatenamede rendre explicitement la zone de texte, vous pouvez donc la transmettre null. Notez qu'il ne nécessite pas explicitement le paramètre id, il l'inférera du nom de l'élément. Et toutes les choses de validation sont toujours actives avec EditorFor

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")
Archil
la source
7

La réponse de ben m'a obtenu ce que je cherchais sauf que vous devez l'envelopper en Html.

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))
Rip Ryness
la source
4

C'est appeler Microsoft GOTCHA

Utilisez le nom en majuscules, comme ceci

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})
Ali Adravi
la source
3

un peu "non joli" =), essayez:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")
benwasd
la source
Cela semble être un moyen simple et agréable de le faire. Si un peu hacky :-)
Rob Stevenson-Leggett
euh, de cette façon, ne préférez-vous pas simplement prendre Html.TexBox normal .. puisque tout typage statique a disparu de toute façon après le remplacement
sharp johnny
1

Pour moi, ça marche! J'espère que ça aide!

@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })
Jonas
la source
1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

Je ne sais pas lequel de ces deux paramètres de chaîne au milieu fait le travail, mais cela n'a fonctionné que lorsque j'ai tapé les deux.

Monsieur Ajdos
la source
C'est Id et Nom. cela a fonctionné pour moi. J'ai parcouru toutes les réponses ci-dessus et aucune d'entre elles n'a fonctionné, mais celle-ci 1. Merci.
Orion
public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. Aucune idée de ce qui templateNameest censé être, alors je l'ai utilisé null. Car htmlFieldNamej'ai utilisé le nom du paramètre (dans mon cas "ipmi" au lieu de "IPMI"). Cela a fait l'affaire pour moi.
BCdotWEB
0

Pour cet exemple, je désactivais les champs de formulaire en fonction des autorisations, mais je les montrais toujours. J'avais un champ caché pour envoyer la valeur au contrôleur, mais je voulais un nom de champ différent dans EditorFor. Le premier paramètre après la valeur du modèle représente la propriété "name", le second est le nouveau nom.

@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

Résulte en:

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 
ScottLenart
la source
0

Restez simple, vous fournissez déjà l'ID, vous devriez simplement pouvoir utiliser la méthode "TextBox" au lieu de "TextBoxFor" et cela fonctionnera bien côté client et côté serveur. En outre, bien que la réponse acceptée fonctionnera, mais produira des attributs de nom en double sur votre balise si vous l'inspectez à l'aide d'un navigateur. La solution ci-dessous n'a pas ce problème.

MvcHtmlString Html.TextBox (nom de chaîne, valeur de chaîne, objet htmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
TroySteven
la source