ASP.NET MVC 3: Überschreiben Sie das Attribut "name" mit TextBoxFor

99

Ist es möglich, Html.TextBoxFordas Namensattribut zu überschreiben?

Ich habe es ohne Erfolg versucht. Ich muss TextBoxFor verwenden, damit die clientseitige Validierung funktioniert. Aus Gründen, auf die ich nicht eingehen möchte, muss sich der Name des Textfelds von dem generierten unterscheiden.

Ich habe folgendes versucht:

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

Welches funktioniert für ID, aber nicht Name. Ist das möglich?

Update : Den Code für TextBoxFor untersuchen. Es sieht nicht so aus, als gäbe es einen einfachen Weg. Hoffentlich kann mir jemand das Gegenteil beweisen.

Rob Stevenson-Leggett
quelle
Was ist der Datentyp von 'Data'
Archil
2
Diese Fragen stellen etwas anderes. Auch - dies ist der ältere der drei, also denke ich, du meinst dupliziert mit.
Rob Stevenson-Leggett

Antworten:

234

Rob, eigentlich gibt es einen viel einfacheren Weg. Verwenden Sie anstelle von name Name :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })
anar khalilov
quelle
11
Bei Groß- und Kleinschreibung wird von @highwingers unterschieden. Dieses winzige Detail kann Stunden sparen.
Anar Khalilov
3
Overkill .. Name aber ID X_X
Vladimirs
2
Seltsamerweise unterscheidet "id" nicht zwischen Groß- und Kleinschreibung (funktioniert gut mit Id und id), "name" jedoch nicht.
Vladimirs
10
Wenn Sie in ASP.NET 4 NameErgebnisse in zwei Attributen bereitstellen , Nameund name, und der Modellordner verwendet das name.
GSerg
1
Aber die Behandlung von zwei verschiedenen Eigenschaften, deren Namen sich nur von Fall zu Fall unterscheiden, ist ein Rezept für einen Wartungsalptraum .....
James McCormack
41

Fragen Sie dies, weil Sie dem Namen ein Präfix zuweisen möchten? In diesem Fall können Sie dies ViewData.TemplateInfo.HtmlFieldPrefixin Ihrem Controller tun .

Ich habe viel über dieses Zeug aus Brad Wilsons Blog gelernt .

James McCormack
quelle
Das sieht aus wie der Gewinner! Wunderschönen.
Rob Stevenson-Leggett
2
Ja, sie haben das schön versteckt, nicht wahr :)
James McCormack
Dies ersparte mir nur einige Kopfschmerzen und Code-Duplikationen.
DavidXYZ
13

EditorFor hat eine Überladung, in der Sie das nameAttribut als Parameter angeben können :

 @Html.EditorFor(expression, null, name)
Beschützer eins
quelle
1
Hätte mir Stunden gespart, wenn ich das vor Stunden gefunden hätte, haha
Johnie Karr
Interessant, aber es gibt keine Überladung für das Namensattribut für ähnliche Helfer wie DropDownListFor. Sie müssen es im Parameter HTML-Attribute angeben (mit einem Großbuchstaben N im Namen).
nmit026
8

Versuchen Sie EditorFor . Sie können eine Zeichenfolge als Vorlagennamen übergeben, wenn Sie sicherstellen möchten, dass das Textfeld auch dann gerendert wird, wenn der Eigenschaftstyp keine Zeichenfolge ist. Wenn die Eigenschaft bereits eine Zeichenfolge ist, muss das templatenameTextfeld nicht explizit gerendert werden, damit Sie es übergeben können null. Beachten Sie, dass der Parameter id nicht explizit erforderlich ist, sondern aus dem Elementnamen abgeleitet wird. Und alle Validierungssachen sind mit EditorFor noch aktiv

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

Bens Antwort hat mir das gebracht, wonach ich gesucht habe, außer dass Sie sich in Html.Raw einwickeln müssen

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

Es heißt Microsoft GOTCHA

Verwenden Sie den Namen in Großbuchstaben wie folgt

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

ein bisschen "unpretty" =), versuche:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")
benwasd
quelle
Scheint eine schöne einfache Möglichkeit zu sein. Wenn ein bisschen hacky :-)
Rob Stevenson-Leggett
ähm, auf diese Weise würden Sie nicht lieber nur normale Html.TexBox nehmen .. da jede statische Eingabe nach dem Ersetzen sowieso weg ist
scharfer Johnny
1

Bei mir funktioniert es! Ich hoffe das hilft!

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

Ich bin mir nicht sicher, welcher dieser beiden Zeichenfolgenparameter in der Mitte die Arbeit erledigt, aber es hat nur funktioniert, wenn ich beide eingegeben habe.

Mr. Ajdos
quelle
Es ist Id und Name. das hat bei mir funktioniert. Ich habe alle oben genannten Antworten durchgesehen und keine davon hat funktioniert, aber diese 1. Danke.
Orion
public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. Keine Ahnung, was sein templateNamesoll, also habe ich verwendet null. Denn htmlFieldNameich habe den Namen des Parameters verwendet (in meinem Fall "ipmi" anstelle von "IPMI"). Das hat den Trick für mich getan.
BCdotWEB
0

In diesem Beispiel habe ich Formularfelder basierend auf Berechtigungen deaktiviert, sie aber weiterhin angezeigt. Ich hatte ein verstecktes Feld, um den Wert an den Controller zu senden, wollte aber einen anderen Feldnamen im EditorFor. Der erste Parameter nach dem Modellwert steht für die Eigenschaft "Name", der zweite für den neuen Namen.

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

Ergebnisse in:

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

Halten Sie es einfach, wenn Sie bereits die ID angegeben haben, sollten Sie einfach in der Lage sein, die Methode "TextBox" anstelle von "TextBoxFor" zu verwenden, und sie funktioniert gut auf Client- und Serverseite. Darüber hinaus funktioniert die akzeptierte Antwort zwar, erzeugt jedoch doppelte Namensattribute auf Ihrem Tag, wenn Sie sie mit einem Browser überprüfen. Die folgende Lösung hat dieses Problem nicht.

MvcHtmlString Html.TextBox (Zeichenfolgenname, Zeichenfolgenwert, Objekt htmlAttributes)

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