web-dev-qa-db-fra.com

ASP.NET MVC 3: remplacement de l'attribut "name" avec TextBoxFor

Est-il possible, en utilisant Html.TextBoxFor, de remplacer l'attribut name?

J'ai essayé sans succès. Je dois utiliser TextBoxFor pour que la validation côté client fonctionne. Cependant, pour des raisons qui m'échappent, le nom de la zone de texte doit être 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 le nom. Est-ce possible?

Update : Recherche du code dans TextBoxFor. Cela ne semble pas être un moyen facile. J'espère que quelqu'un pourra me prouver le contraire.

82

Rob, en réalité, il existe un moyen beaucoup plus simple. Au lieu de name , utilisezName:

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

Demandez-vous ceci parce que vous voulez appliquer un préfixe au nom? Si c'est le cas, vous pouvez le faire en définissant ViewData.TemplateInfo.HtmlFieldPrefix dans votre contrôleur.

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

40
James McCormack

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

 @Html.EditorFor(expression, null, name)
12
Protector one

Essayez EditorFor . vous pouvez passer chaîne en tant que nom de modèle si vous voulez vous assurer que la zone de texte est rendue même si le type de propriété n'est pas une chaîne. Si property est déjà une chaîne, il n'est pas nécessaire que templatename soit explicite pour rendre la zone de texte. Vous pouvez donc passer null. Notez qu'il n'exige pas explicitement le paramètre id, il le déduira 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")
8
archil

la réponse de ben m'a donné ce que je cherchais sauf que vous devez vous envelopper en HTML.

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

un peu "unsde" =), essayez:

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

C'est appeler MicrosoftGOTCHA 

Utilisez le nom en majuscule, comme ceci

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

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

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

Vous ne savez pas lequel de ces deux paramètres de chaîne au milieu fait le travail, mais cela ne fonctionne que lorsque je les ai tapés tous les deux.

1
Mr.Ajdos

Pour cet exemple, je désactivais les champs de formulaire en fonction des autorisations tout en les affichant. 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
ScottLenart

Restez simple, votre ID déjà fourni, vous devriez simplement pouvoir utiliser la méthode "TextBox" au lieu de "TextBoxFor" et cela fonctionnera bien côté client et côté serveur. De plus, bien que la réponse acceptée fonctionne, mais produise 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" }
0
TroySteven