Fecha solo de TextBoxFor ()

272

Tengo problemas para mostrar la única parte de fecha de DateTime en un cuadro de texto usando TextBoxFor <,> (expresión, htmlAttributes).

El modelo se basa en Linq2SQL, el campo es un DateTime en SQL y en el modelo de entidad.

Ha fallado:

<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>

Este truco parece estar depreciado, cualquier valor de cadena en el objeto htmlAttribute se ignora.

Ha fallado:

[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }

Me gustaría almacenar y mostrar solo la parte de fecha en la vista de detalles / edición, sin la parte "00:00:00".

Kronos
fuente

Respuestas:

237
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }

Luego:

<%=Html.EditorFor(m => m.StartDate) %>
Kevin Craft
fuente
Sí, como ahora está el EditorFor helper y MVC2 está finalizado, su solución es el camino a seguir
Kronos el
66
Pero ahora el selector de fecha de la interfaz de usuario de Jquery no se puede aplicar a esta entrada, ya que ignora mis atributos @ class = "datepicker" como se especifica en el ayudante Html.EditorFor (). Entonces este cuadro de texto ahora se formatea correctamente, pero no inicia un selector de fecha cuando se hace clic en él. Entonces, arregló una cosa y rompió otra.
Aaron
55
¿Cómo puedo hacer que se muestre en línea con esta solución, pero también hacer que inicie el selector de fecha como lo hizo con Html.TextboxFor ()
Aaron
49
Estoy usando la sintaxis MVC4 Razor, el campo de fecha se representa como @Html.EditorFor(m => m.IssueDate)y el formato en el modelo se aplica como [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]pero la fecha todavía se muestra como01/01/0001 12:00:00 AM
bjan
44
@Aaron No hay sobrecarga de EditorFor que tenga un parámetro htmlAttributes. Probablemente lo esté pasando al parámetro viewTemplate o algo así, pensando que estaba pasando htmlAttributes. Esta es la desventaja de Editorfor. TextBoxFor ignora la anotación DisplayFormat. La solución de Alexeyss aplica el formato de manera diferente para evitar esto.
AaronLS
363

MVC4 ha resuelto este problema agregando una nueva TextBoxForsobrecarga, que toma un parámetro de formato de cadena. Ahora puede simplemente hacer esto:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")

También hay una sobrecarga que toma atributos html, por lo que puede configurar la clase CSS, seleccionar los datepickers, etc.

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })
Ross McNab
fuente
40
Esta es la mejor respuesta para MVC4: me permite usar jquery UI datepicker y formatea la selección haciendo esto:@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
ericb
3
¡Gracias! Pero parece un error que TextBoxFor ignore el [DisplayFormat]atributo del modelo . Me alegra que haya al menos una anulación en TextBoxFor (y que me haya avisado).
Neil Laslett
77
Lo configuré así, @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")pero en httpPost obtengo datos como MM.dd.aaaa. ¿Cómo resolver esto?
user007
3
Te estoy comprando una cerveza! Este pequeño problema me causó mucho dolor de cabeza hasta que encontré esta respuesta.
JoshYates1980
3
FYI : Muchos navegadores y las input[type=date]especificaciones requieren "{0:yyyy-MM-dd}"formato.
KyleMit
259
<%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>
Alexeyss
fuente
55
La solución EditorFor funciona, excepto cuando necesita anular otros atributos HTML como el id o la clase. Esta es una gran solución. Es extraño que la V necesite ser mayúscula.
Ben Mills
1
Para manejar nulo de forma segura, puede hacer Model.EndDate.GetValueOrDefault (). ToString ("dd.MM.yyyy"). El valor predeterminado de Datetime se mostrará si Model.EndDate es nulo.
15
Con respecto a los valores nulos, el valor predeterminado de DateTime es el 1 de enero de 1901, en mi opinión, sería mejor usarlo@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj Sagan,
1
@Spikolynn, esto no generó un segundo atributo de 'Valor' para mí (plantilla MVC3 / razor).
Doug S
2
IMPORTANTE: Verifique la "V" mayúscula en "Valor", ¡la letra minúscula no lo hará!
Tejasvi Hegde
48

O use los ayudantes sin tipo:

<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>
andersjanmyr
fuente
22
Ligera variación@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Dan Friedman
Utiliza Razor en lugar del motor de vista ASPX, pero ambos funcionan en MVC 4 y cambiar de una sintaxis a otra es trivial. Publiqué en Razor porque eso es lo que usé y probé. Como dije, es una variación.
Dan Friedman
1
@Dan Friedman: ¡Este era el camino a seguir para mí! Solía ​​trabajar con una plantilla de editor, pero también tuve que crear mi propio html y también incluir todos los mensajes de validación Y todos los atributos de Bootstrap, así que este es realmente el camino a seguir para mí (asp.net mvc5)
Michel
1
¿Puedes crear un nuevo problema y detallar lo que has hecho? Etiquetame y estaré encantado de ayudarte.
Dan Friedman
1
Esta solución es la mejor cuando necesita globalización.
alansiqueira27
26

Esto funcionó para mí.

@Html.TextBoxFor(m => m.DateOfBirth, "{0:MM/dd/yyyy}", new { size = "12", @class = "DOB", tabindex = 121 })
usuario5240713
fuente
12

No tengas miedo de usar HTML sin formato.

<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />
Tamas Czinege
fuente
44
¿Cómo lo publicaría entonces? Porque es casi seguro que la fecha no se volverá a analizar en el servidor.
Robert Koritnik
10
Siempre que incluya el 'name = "StartDate"' adecuado, el archivador del modelo lo recogerá.
naspinski
@DrJokepu lo único que ese trabajador para mí en MVC3. Es decir, no pude hacer TextBoxForo EditorForformatear el valor de todos modos. Vea mi pregunta: TextBoxPara el ayudante mezcla día y mes en fechas
horgh
10

TL; DR;

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")

¡Solicitar [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]no funcionó para mí!


Explicación:

Para mostrar una propiedad de fecha de su modelo usando Html.TextBoxFor:

ingrese la descripción de la imagen aquí

Propiedad de fecha de su clase de modelo:

public DateTime DOB { get; set; }

No se necesita nada más en el lado del modelo.


En Razor haces:

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")


Explicación:

La fecha de un inputelemento de tipo html datedebe formatearse con respecto a ISO8601 , que es:yyyy-MM-dd

La fecha que se muestra se formatea según la configuración regional del navegador del usuario, pero el valor analizado siempre se formatea aaaa-mm-dd.

Mi experiencia es que el idioma no está determinado por el Accept-Languageencabezado, sino por el idioma de visualización del navegador o el idioma del sistema operativo.

Leyendas
fuente
4

También puede usar los atributos HTML 5 aplicando esta anotación de datos:

[DataType(DataType.Date)]

Pero el problema es que esto habilita un selector de fecha específico del navegador para los navegadores HTML 5. Todavía necesita su propio selector de fechas para navegadores sin soporte, y luego debe asegurarse de que su selector de fechas no aparezca además del de un navegador (Modernizr puede hacer esto fácilmente) u ocultar el navegador si lo hace (complicado y yo no sé qué tan confiables fueron los métodos que vi).

Al final, fui con Alex porque mi entorno actual no tiene Modernizr, pero si lo tuviera, lo habría usado para mostrar condicionalmente mi selector de datos si el navegador ya no era compatible.

AaronLS
fuente
3

Para mí, necesitaba mantener el TextboxFor()porque el uso EditorFor()cambia el tipo de entrada hasta la fecha. Lo que, en Chrome, agrega un selector de fecha incorporado, que arruinó el jQuery datepicker que ya estaba usando. Por lo tanto, para continuar usando TextboxFor()AND solo generar la fecha, puede hacer esto:

<tr>
    <td class="Label">@Html.LabelFor(model => model.DeliveryDate)</td>
    @{
        string deliveryDate = Model.DeliveryDate.ToShortDateString();
    }
    <td>@Html.TextBoxFor(model => model.DeliveryDate, new { @Value = deliveryDate }) *</td>
    <td style="color: red;">@Html.ValidationMessageFor(model => model.DeliveryDate)</td>
</tr>
BuceoSteve
fuente
1

El atributo DisplayFormat no funcionó para mí de ninguna de las formas en la carga inicial. Creé un EditorTemplate en su lugar:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%@ Import Namespace="System.Web.Mvc.Html" %>
<%=
    Html.TextBox("", Model.ToShortDateString(), new { @class = "date-range" }) %>
triskelion
fuente
1

El Editor de plantillas funcionará solo con fines de visualización. Si usa el mismo editor (lo cual tiene sentido porque es un editor) y proporcionó un valor como 31/01/2010, recibirá un mensaje de error que indica que el formato no es válido.

guerven
fuente
1

Uso Globalize, así que trabajo con muchos formatos de fecha, así que use lo siguiente:

@Html.TextBoxFor(m => m.DateOfBirth, "{0:d}")

Esto ajustará automáticamente el formato de fecha a la configuración regional del navegador.

Liam
fuente
1

Tenga en cuenta que la exhibición dependerá de la cultura. Y aunque en la mayoría de los casos todas las otras respuestas son correctas, no funcionó para mí. El problema cultural también causará diferentes problemas con jQuery datepicker, si está adjunto.

Si desea forzar el escape de formato /de la siguiente manera:

@Html.TextBoxFor(model => model.dtArrivalDate, "{0:MM\\/dd\\/yyyy}")

Si no se me escapó, se muestra 08-01-2010vs. esperado 08/01/2010.

Además, si no se escapó, jQuery datepicker seleccionará defaultDate diferente, en mi caso lo fue May 10, 2012.

CrnaStena
fuente
1

Si está utilizando el selector de fecha Bootstrap, puede agregar el atributo data_date_format como se muestra a continuación.

      @Html.TextBoxFor(m => m.StartDate, new { 
@id = "your-id", @class = "datepicker form-control input-datepicker", placeholder = "dd/mm/yyyy", data_date_format = "dd/mm/yyyy" 
})
uda
fuente
0

// datimetime se muestra en la fecha El marcador es 24/11/2011 12:00:00 a.m.

// puedes dividir esto por espacio y establecer el valor solo en fecha

Guión:

    if ($("#StartDate").val() != '') {
        var arrDate = $('#StartDate').val().split(" ");
        $('#StartDate').val(arrDate[0]);
    }

Margen:

    <div class="editor-field">
        @Html.LabelFor(model => model.StartDate, "Start Date")
        @Html.TextBoxFor(model => model.StartDate, new { @class = "date-picker-needed" })
    </div>

Espera que esto ayude ...

coymax
fuente
77
Tu solución debería funcionar. Pero en mi humilde opinión, puede ser peligroso confiar en el lado del cliente en la fecha de cadena formateada emitida en el lado del servidor. Si la configuración regional en el lado del servidor no incluye un espacio entre la fecha y la hora, su solución expuesta fallará.
Kronos
0

Claro que puedes usar Html.EditorFor. Pero si desea usar TextBoxFor y usar el formato del atributo DisplayFormat, puede usarlo de esta manera:

@Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)

o crea la siguiente extensión:

public static class HtmlExtensions
{
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
    }
}
Yury Dzhantuganov
fuente
0

Simplemente agregue al lado de su modelo.

[DataType(DataType.Date)]
public string dtArrivalDate { get; set; }
arturas
fuente
0

Cuando se utilizan ayudantes de etiqueta en ASP.NET Core, el formato debe especificarse en formato ISO. Si no se especifica como tal, los datos de entrada enlazados no se mostrarán correctamente y se mostrarán como mm / dd / aaaa sin valor.

Modelo:

[Display(Name = "Hire")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? HireDate { get; set; }

Ver:

<input asp-for="Entity.HireDate" class="form-control" />

El formato también se puede especificar en la vista utilizando el atributo de formato asp.

El HTML resultante tendrá el siguiente aspecto:

<input class="form-control" type="date" id="Entity_HireDate" 
    name="Entity.HireDate" value="2012-01-01">
Michael Emerick
fuente
0

Puede usar el siguiente código para imprimir el tiempo en formato HH: mm . En mi caso, el tipo de propiedad es TimeSpan. Por lo tanto, el valor viene en formato HH: mm: tt, pero tengo que mostrarlo en el formato anterior, es decir. HH: mm

Entonces puedes usar este código:

@Html.TextBoxFor(x =>x.mTimeFrom, null, new {@Value =Model.mTimeFrom.ToString().Substring(0,5), @class = "form-control success" })
Alguacil
fuente
0

Si insiste en usar el [DisplayFormat], pero no está usando MVC4, puede usar esto:

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
Aeon Suen
fuente