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.


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" })

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 .


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)

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")

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"))

4

C'est appeler Microsoft GOTCHA

Utilisez le nom en majuscules, comme ceci

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})

3

un peu "non joli" =), essayez:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

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" } })

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.


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" /> 

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" }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.