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ę.


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

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


13

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

 @Html.EditorFor(expression, null, name)

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

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

4

Nazywa się Microsoft GOTCHA

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

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

3

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

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

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

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.


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

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" }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.