Różnice między Html.TextboxFor i Html.EditorFor w MVC i Razor

170

Dlaczego domyślnie zostały one zmienione podczas dodawania nowego widoku „edycji”? Jakie są zalety korzystania z EditorFor()vs. TextboxFor()?

znalazłem to

Domyślnie rusztowania tworzenia i edycji używają teraz pomocnika Html.EditorFor zamiast pomocnika Html.TextBoxFor. Poprawia to obsługę metadanych w modelu w postaci atrybutów adnotacji danych, gdy okno dialogowe Dodaj widok generuje widok.

ShaneKm
źródło
5
czy ktoś ma przykład jak to się robi? na przykład redaktor dla DatePicker?
ShaneKm

Odpowiedzi:

166

Zaletą EditorForjest to, że Twój kod nie jest powiązany z plikiem <input type="text". Więc jeśli zdecydujesz się coś zmienić w aspekcie renderowania twoich pól tekstowych, jak zawijanie ich w a, divmożesz po prostu napisać niestandardowy szablon edytora ( ~/Views/Shared/EditorTemplates/string.cshtml), a wszystkie pola tekstowe w aplikacji automatycznie skorzystają z tej zmiany, podczas gdy jeśli zakodowałeś Html.TextBoxForcię na stałe będzie musiał go wszędzie modyfikować. Możesz również użyć adnotacji danych, aby kontrolować sposób renderowania.

Darin Dimitrov
źródło
Wystąpił błąd, prawdopodobnie w starej wersji. EditorFor nie rozpoznaje słowa „double”. Dla „long” traktuje to jako „int”, a step = „0.01” nie działa w atrybutach, więc użyłem TextBoxFor i dodałem @ type = 'number' @ step = "0.01", więc zadziałało
Charlie
129

TextBoxFor : będzie renderować się jak element html do wprowadzania tekstu odpowiadający określonemu wyrażeniu. Mówiąc prościej, zawsze będzie renderować się jak wejściowe pole tekstowe, niezależnie od typu danych właściwości, które są wiązane z kontrolką.

EditorFor : Ta kontrolka jest nieco inteligentna. Renderuje znaczniki HTML na podstawie typu danych właściwości. Załóżmy na przykład, że w modelu istnieje własność boolowska. Aby wyświetlić tę właściwość w widoku jako pole wyboru, możemy użyć CheckBoxFor lub EditorFor. Oba będą generować te same znaczniki.

Jaka jest zaleta korzystania z EditorFor?

Jak wiemy, w zależności od typu danych właściwości generuje znaczniki html. Załóżmy więc, że jutro, jeśli zmienimy typ danych właściwości w modelu, nie ma potrzeby niczego zmieniać w widoku. EditorFor control automatycznie zmieni znaczniki HTML.

Surowe
źródło
15
świetna, prosta odpowiedź, którą może łatwo przyswoić nawet nowicjuszowi.
Kings
powyższy opis pomoże temu linkowi forums.asp.net/t/1948071.aspx?EditorFor+and+EditorForModel
Amol Shiledar
Czy jest kiedykolwiek przypadek, w którym bezwzględnie powinieneś używać TextBoxFor?
eaglei 22
55

Html.TextboxForZawsze tworzy pole tekstowe ( <input type="text" ...).

Podczas gdy EditorFor sprawdza typ i metainformacje i może renderować inną kontrolkę lub dostarczony szablon.

Na przykład dla właściwości DateTime można utworzyć szablon, który używa jQuery DatePicker.

GvS
źródło
12
Dowolny przykład, jak zaimplementować datepicker jquery przy użyciu editfor?
Peru,
2
dziękuję za uproszczenie różnicy za pomocą przypadku daty i godziny.
Kings
1
@Peru, tutaj lub tutaj, jak to zrobić implement jquery datepickeri jak z niego korzystać, EditorForjest tutaj
shaijut
8

Jest to jedna z podstawowych różnic, o których nie wspomniano w poprzednich komentarzach:
Readonlywłaściwość będzie działać z polem tekstowym i nie będzie działać z EditorFor.

@Html.TextBoxFor(model => model.DateSoldOn, new { @readonly = "readonly" })

Powyższy kod działa, gdzie podobnie jak w przypadku podążania nie można ustawić sterowania tylko do odczytu .

@Html.EditorFor(model => model.DateSoldOn, new { @readonly = "readonly" })
Lalitha1729
źródło
16
Możesz ustawić EditorFor tylko do odczytu, używając następującej składni: @ Html.EditorFor (model => model.DateSoldOn, new {htmlAttributes = new {@readonly = "readonly"}})
Doug Knudsen
4

Istnieje również niewielka różnica w danych wyjściowych html dla typu danych typu string.

Html.EditorFor:  
<input id="Contact_FirstName" class="text-box single-line" type="text" value="Greg" name="Contact.FirstName">

Html.TextBoxFor:
<input id="Contact_FirstName" type="text" value="Greg" name="Contact.FirstName">
Greg Gum
źródło
2
to absolutnie zła odpowiedź, ponieważ kluczową różnicą jest to, że Texbox zwraca dane wejściowe, a edytor for zwraca twój szablon, gdzie wejście jest domyślnym szablonem dla editor for.
Artem G