Fecha solo desde TextBoxFor ()

Tengo problemas para mostrar la única parte de fecha de DateTime en un cuadro de texto usando TextBoxFor (expression, htmlAttributes).

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

Ha fallado:

 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 la fecha en la vista de detalles / edición, sin la parte “00:00:00”.

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

Entonces:

 <%=Html.EditorFor(m => m.StartDate) %> 

MVC4 ha resuelto este problema al agregar una nueva sobrecarga TextBoxFor , que toma un parámetro de formato de cadena. Ahora puedes simplemente hacer esto:

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

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

 @Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" }) 
 <%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%> 

O usa los ayudantes sin tipo:

 <%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %> 

Esto funcionó para mí.

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

No tengas miedo de usar HTML sin formato.

  

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 navegadores HTML 5. Todavía necesita su propio datepicker para navegadores sin soporte, y luego debe asegurarse de que su selector de fecha no aparezca además de un navegador (Modernizr puede hacerlo fácilmente) u oculte el navegador si lo hace (complicado y yo). no sé qué tan confiables eran los métodos que vi).

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

Para mí, necesitaba mantener el TextboxFor() porque el uso de EditorFor() cambia el tipo de entrada a la fecha. Lo cual, en Chrome, agrega un datepicker incorporado, que arruinó el jgetier de jQuery que ya estaba usando. Entonces, para seguir usando TextboxFor() Y solo mostrar la fecha, puede hacer esto:

  @Html.LabelFor(model => model.DeliveryDate) @{ string deliveryDate = Model.DeliveryDate.ToShortDateString(); } @Html.TextBoxFor(model => model.DeliveryDate, new { @Value = deliveryDate }) * @Html.ValidationMessageFor(model => model.DeliveryDate)  

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

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

El Editor de plantillas funcionará solo con fines de visualización. Si usa el mismo editor (que 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.

Tenga en cuenta que la visualizació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 de la cultura también causará diferentes problemas con jQuery datepicker, si está adjuntado.

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

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

Si no se escapó para mí, se mostrará el 08-01-2010 frente al esperado el 08/01/2010 .

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

// datimetime aparece en datePicker es el 24/11/2011 12:00:00 AM

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

Guión:

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

Margen:

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

Espera que esto ayude ..

Claro que puedes usar Html.EditorFor. Pero si desea utilizar 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(this HtmlHelper htmlHelper, Expression> expression, object htmlAttributes) { return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes); } } 

Solo agregue al lado de su modelo.

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

Cuando se utilizan asistentes de tags 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 ningún valor.

Modelo:

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

Ver:

  

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

El HTML resultante se verá de la siguiente manera:

  

Utilizo Globalize para trabajar 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.

Si está utilizando el selector de fecha de Bootstrap, entonces simplemente puede agregar el atributo data_date_format como se indica 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" })