Diferencias entre Html.TextboxFor y Html.EditorFor en MVC y Razor

170

¿Por qué se modificaron de manera predeterminada al agregar una nueva vista de "edición"? ¿Cuáles son las ventajas al usar EditorFor()vs. TextboxFor()?

encontré esto

Por defecto, los andamios Crear y Editar ahora usan el ayudante Html.EditorFor en lugar del ayudante Html.TextBoxFor. Esto mejora la compatibilidad con metadatos en el modelo en forma de atributos de anotación de datos cuando el cuadro de diálogo Agregar vista genera una vista.

ShaneKm
fuente
55
¿Alguien tiene un ejemplo de cómo se hace esto? por ejemplo escribiendo editor para un DatePicker?
ShaneKm

Respuestas:

166

Las ventajas de EditorFores que su código no está vinculado a un <input type="text". Así que si usted decide cambiar algo en el aspecto de cómo sus cuadros de texto se representan como envolviéndolos en un divsimplemente podría escribir un editor de plantillas a medida ( ~/Views/Shared/EditorTemplates/string.cshtml) y todos sus cuadros de texto en su aplicación beneficiará automáticamente de este cambio, mientras que si ha hardcoded Html.TextBoxForse tendrá que modificarlo en todas partes. También puede usar Anotaciones de datos para controlar la forma en que se representa.

Darin Dimitrov
fuente
Hay un error, probablemente en una versión anterior. EditorFor no reconoce 'doble'. Para 'largo' lo considera como 'int' y step = "0.01" no funciona en los atributos, por lo que utilicé TextBoxFor y agregué @ type = 'number' @ step = "0.01", así que funcionó
Charlie
129

TextBoxFor : Representará como elemento html de entrada de texto correspondiente a la expresión especificada. En palabras simples, siempre se representará como un cuadro de texto de entrada, independientemente del tipo de datos de la propiedad que se está vinculando con el control.

EditorFor : Este control es un poco inteligente. Representa el marcado HTML basado en el tipo de datos de la propiedad. Por ejemplo, supongamos que hay una propiedad booleana en el modelo. Para representar esta propiedad en la vista como una casilla de verificación, podemos usar CheckBoxFor o EditorFor. Ambos generarán el mismo marcado.

¿Cuál es la ventaja de usar EditorFor?

Como sabemos, dependiendo del tipo de datos de la propiedad, genera el marcado html. Supongamos que mañana si cambiamos el tipo de datos de la propiedad en el modelo, no es necesario cambiar nada en la vista. El control EditorFor cambiará el marcado html automáticamente.

Harshal
fuente
15
Gran respuesta simple que puede ser absorbida fácilmente incluso por un novato.
Reyes
la descripción anterior ayudará a este enlace forum.asp.net/t/1948071.aspx?EditorFor+and+EditorForModel
Amol Shiledar
¿Alguna vez hay un caso en el que deberías usar TextBoxFor?
eaglei22
55

El Html.TextboxForsiempre crea un cuadro de texto ( <input type="text" ...).

Mientras que EditorFor analiza el tipo y la metainformación, y puede representar otro control o una plantilla que usted proporcione.

Por ejemplo, para las propiedades de DateTime, puede crear una plantilla que use jQuery DatePicker.

GvS
fuente
12
¿Algún ejemplo sobre cómo implementar jquery datepicker usando editfor?
Perú
2
gracias por simplificar la diferencia usando el caso de fecha y hora.
Reyes
1
@ Perú, aquí o aquí es cómo implement jquery datepickery usarlo EditorForestá aquí
shaijut
8

Esta es una de las diferencias básicas no mencionadas en los comentarios anteriores: la
Readonlypropiedad funcionará con el cuadro de texto para y no funcionará con EditorFor.

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

El código anterior funciona, donde al igual que con el siguiente no puede hacer el control de solo lectura .

@Html.EditorFor(model => model.DateSoldOn, new { @readonly = "readonly" })
Lalitha1729
fuente
16
Puede hacer que EditorFor lea solo usando la siguiente sintaxis: @ Html.EditorFor (model => model.DateSoldOn, new {htmlAttributes = new {@readonly = "readonly"}})
Doug Knudsen
4

También hay una ligera diferencia en la salida html para un tipo de datos de cadena.

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
fuente
2
es una respuesta absolutamente incorrecta, porque la diferencia clave es que Texbox devuelve la entrada y editorfor devuelve su plantilla donde input es la plantilla predeterminada para editorfor.
Artem G