Различия между Html.TextboxFor и Html.EditorFor в MVC и Razor

170

Почему по умолчанию они были изменены при добавлении нового представления «Изменить»? Какие преимущества при использовании EditorFor()против TextboxFor()?

я нашел это

По умолчанию скаффолды Create и Edit теперь используют помощник Html.EditorFor вместо помощника Html.TextBoxFor. Это улучшает поддержку метаданных в модели в форме атрибутов аннотаций данных, когда диалоговое окно «Добавить представление» создает представление.

ShaneKm
источник
5
У кого-нибудь есть пример того, как это делается? например, написание редактора для DatePicker?
ShaneKm

Ответы:

166

Преимущества в EditorForтом, что ваш код не привязан к <input type="text". Поэтому, если вы решите что-то изменить в соответствии с тем, как визуализируются ваши текстовые поля, например обернуть их в, divвы можете просто написать собственный шаблон редактора ( ~/Views/Shared/EditorTemplates/string.cshtml), и все ваши текстовые поля в вашем приложении автоматически получат выгоду от этого изменения, тогда как если вы жестко закодировали Html.TextBoxForвас придется модифицировать его везде. Вы также можете использовать аннотации данных, чтобы контролировать способ визуализации.

Дарин димитров
источник
Существует ошибка, вероятно, в старой версии. EditorFor не распознает «двойной». Для 'long' он рассматривает его как 'int', а step = "0.01" не работает в атрибутах, поэтому я использовал TextBoxFor и добавил @ type = 'number' @ step = "0.01", чтобы он работал
Чарли
129

TextBoxFor : будет отображаться как элемент ввода текста html, соответствующий указанному выражению. Проще говоря, он всегда будет отображаться как текстовое поле ввода независимо от типа данных свойства, которое связывается с элементом управления.

EditorFor : этот элемент управления немного умен. Он отображает HTML-разметку на основе типа данных свойства. Например, предположим, что в модели есть логическое свойство. Чтобы отобразить это свойство в виде флажка, мы можем использовать CheckBoxFor или EditorFor. Оба будут генерировать одинаковую разметку.

В чем преимущество использования EditorFor?

Как мы знаем, в зависимости от типа данных свойства генерируется html-разметка. Поэтому предположим, что завтра, если мы изменим тип данных свойства в модели, нет необходимости что-либо менять в представлении. Элемент управления EditorFor автоматически изменит HTML-разметку.

Harshal
источник
15
отличный, простой ответ, который может легко усвоить даже новичок.
Короли
Приведенное
Амол Шиледар
Есть ли когда-нибудь случай, когда вы должны абсолютно использовать TextBoxFor?
eaglei22
55

Html.TextboxForВсегда создает текстовое поле ( <input type="text" ...).

В то время как EditorFor просматривает тип и метаинформацию и может отображать другой элемент управления или шаблон, который вы предоставляете.

Например, для свойств DateTime вы можете создать шаблон, который использует jQuery DatePicker.

GvS
источник
12
Любой пример о том, как реализовать JQuery DatePicker, используя editfor?
Перу,
2
Спасибо за упрощение разницы, используя случай даты и времени.
Короли
1
@Peru, здесь или здесь в том , как implement jquery datepickerи с помощью его EditorForнаходится здесь
shaijut
8

Это одно из основных отличий, не упомянутых в предыдущих комментариях:
Readonlyсвойство будет работать с текстовым полем и не будет работать с ним EditorFor.

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

Вышеприведенный код работает, где, как и в случае со следующим, вы не можете сделать управление доступным только для чтения .

@Html.EditorFor(model => model.DateSoldOn, new { @readonly = "readonly" })
Lalitha1729
источник
16
Вы можете сделать EditorFor только для чтения, используя следующий синтаксис: @ Html.EditorFor (model => model.DateSoldOn, new {htmlAttributes = new {@readonly = "readonly"}})
Дуг Кнудсен,
4

Существует также небольшая разница в выводе html для строкового типа данных.

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">
Грег Гам
источник
2
это абсолютно неправильный ответ, потому что ключевое отличие в том, что Texbox возвращает ввод, и editorfor возвращает ваш шаблон, где input - это шаблон по умолчанию для editorfor.
Артем G