ASP.NET MVC 3: Zastąp atrybut „name” atrybutem TextBoxFor

99

Czy jest to możliwe podczas używania Html.TextBoxFordo zastąpienia atrybutu nazwy?

Próbowałem bez powodzenia. Muszę użyć TextBoxFor, aby sprawdzanie poprawności po stronie klienta działało, jednak z powodów, w które nie będę wchodził, potrzebuję nazwy pola tekstowego, aby różniła się od wygenerowanej.

Próbowałem następujących rzeczy:

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

Która działa dla ID, ale nie dla nazwy czy to możliwe?

Aktualizacja : Przeglądanie kodu TextBoxFor. Nie wygląda na to, że istnieje łatwy sposób. Mam nadzieję, że ktoś może udowodnić, że się mylę.

Rob Stevenson-Leggett
źródło
Jaki jest typ danych „Data”
archil
2
Te pytania dotyczą czegoś nieco innego. Poza tym - to jest starszy z trzech, więc myślę, że masz na myśli duplikat.
Rob Stevenson-Leggett

Odpowiedzi:

234

Rob, właściwie jest o wiele prostszy sposób. Zamiast nazwy użyj nazwy :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })
anar khalilov
źródło
11
Rozróżniana jest wielkość liter, to @highwingers, ten mały szczegół może zaoszczędzić wiele godzin.
anar khalilov
3
Overkill .. Imię, ale id X_X
Vladimirs
2
Dziwne, „id” nie rozróżnia wielkości liter (działa dobrze z Id i id), ale „name” nie.
Vladimirs
10
W przypadku ASP.NET 4 dostarczanie Namewyników w dwóch atrybutach, Namea namespinacz modelu używa name.
GSerg
1
Ale obsługa dwóch różnych właściwości, których nazwy różnią się tylko wielkością liter jest receptą na utrzymanie ..... koszmar
James McCormack
41

Pytasz o to, ponieważ chcesz zastosować przedrostek do nazwy? Jeśli tak, możesz to zrobić, ustawiając ViewData.TemplateInfo.HtmlFieldPrefixkontroler.

Wiele się o tym dowiedziałem z bloga Brada Wilsona .

James McCormack
źródło
To wygląda na zwycięzcę! Piękny.
Rob Stevenson-Leggett
2
Tak, ładnie to ukryli, nieprawdaż :)
James McCormack
To właśnie zaoszczędziło mi bólu głowy i duplikacji kodu.
davidXYZ
13

EditorFor ma przeciążenie, w którym można podać nameatrybut jako parametr:

 @Html.EditorFor(expression, null, name)
Obrońca pierwszy
źródło
1
Oszczędziłoby mi to godziny, gdybym znalazł to godziny temu, haha
Johnie Karr
Interesujące, ale nie ma przeciążenia dla atrybutu name dla podobnych pomocników, takich jak DropDownListFor, musisz określić go w parametrze atrybutów html (z dużym N w nazwie).
nmit026
8

Wypróbuj EditorFor . możesz przekazać ciąg jako nazwę szablonu, jeśli chcesz się upewnić, że pole tekstowe jest renderowane, nawet jeśli typ właściwości nie jest ciągiem. Jeśli właściwość jest już ciągiem, nie musi templatenamejawnie renderować pola tekstowego, więc możesz ją przekazać null. Zauważ, że nie wymaga on jawnie parametru id, wywnioskuje go z nazwy elementu. Wszystkie funkcje sprawdzania poprawności są nadal aktywne w EditorFor

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")
archil
źródło
7

Odpowiedź Bena dała mi to, czego szukałem, z wyjątkiem tego, że musisz zawinąć w Html.Raw

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))
Rip Ryness
źródło
4

Nazywa się Microsoft GOTCHA

Użyj nazwy pisanej wielkimi literami, w ten sposób

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})
Ali Adravi
źródło
3

trochę „unpretty” =), spróbuj:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")
benwasd
źródło
Wydaje się, że to miły, łatwy sposób na zrobienie tego. Jeśli trochę hacky :-)
Rob Stevenson-Leggett
umm, w ten sposób, nie wolałbyś po prostu wziąć zwykłego Html.TexBox .. ponieważ po zmianie i tak nie ma żadnego statycznego wpisywania
sharp johnny
1

U mnie to działa! Mam nadzieję, że pomoże!

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

Nie jestem pewien, który z tych dwóch parametrów łańcuchowych w środku działa, ale zadziałał tylko wtedy, gdy wpisałem oba z nich.

Panie Ajdos
źródło
To identyfikator i imię. to działało dla mnie. Przejrzałem wszystkie powyższe odpowiedzi i żadna z nich nie zadziałała, ale to 1. Dzięki.
Orion
public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. Nie mam pojęcia, co templateNamema być, więc skorzystałem null. Dla htmlFieldNameużyłem nazwy parametru (w moim przypadku "ipmi" zamiast "IPMI"). To mi wystarczyło.
BCdotWEB
0

W tym przykładzie wyłączałem pola formularza na podstawie uprawnień, ale nadal je pokazywałem. Miałem ukryte pole do wysłania wartości do kontrolera, ale chciałem mieć inną nazwę pola w EditorFor. Pierwszy parametr po wartości modelu reprezentuje właściwość „nazwa”, drugi to nowa nazwa.

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

Prowadzi do:

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 
ScottLenart
źródło
0

Uprość, ponieważ już podałeś identyfikator, po prostu powinieneś móc użyć metody „TextBox” zamiast „TextBoxFor” i będzie działać dobrze po stronie klienta i po stronie serwera. Ponadto, chociaż zaakceptowana odpowiedź będzie działać, ale spowoduje utworzenie zduplikowanych atrybutów nazwy na tagu, jeśli sprawdzisz go za pomocą przeglądarki. Poniższe rozwiązanie nie ma tego problemu.

MvcHtmlString Html.TextBox (nazwa ciągu, wartość ciągu, htmlAttributes obiektu)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
TroySteven
źródło