route - Fecha de formato en enlace(ASP.NET MVC)
forms asp net core (12)
En mi aplicación MVC ASP.net tengo una vista que se ve así:
...
<label>Due Date</label>
<%=Html.TextBox("due")%>
...
Estoy usando un ModelBinder
para vincular la publicación a mi modelo (la propiedad debida es del tipo DateTime
). El problema es cuando pongo "01/01/2009" en el cuadro de texto, y la publicación no se valida (debido a que otros datos son ingresados ​​incorrectamente). El cuaderno lo repobla con la fecha y hora "01/01/2009 00:00:00 ".
¿Hay alguna manera de decirle a la carpeta que formatee la fecha correctamente (es decir, ToShortDateString()
)?
Para obtener acceso fuertemente tipado a su modelo en el código detrás de su vista, puede hacer esto:
public partial class SomethingView : ViewPage<T>
{
}
Donde T es el tipo de ViewData que desea transferir desde su Acción.
Luego en su controlador tendría una acción:
public ActionResult Something(){
T myObject = new T();
T.Property = DateTime.Today();
Return View("Something", myObject);
}
Después de eso, tiene buenos datos del modelo fuertemente tipados en su vista para que pueda hacer:
<label>My Property</label>
<%=Html.TextBox(ViewData.Model.Property.ToShortDateString())%>
Encontré esta pregunta mientras buscaba la respuesta yo mismo. Las soluciones anteriores no me funcionaron porque mi DateTime es nulo. Así es como lo resolví con soporte para objetos DateTime que aceptan nulos.
<%= Html.TextBox(String.Format("{0:d}", Model.Property)) %>
Por qué no usas
<% =Html.TextBox("due", Model.due.ToShortDateString()) %>
Encuentro que la mejor manera de hacerlo es restablecer el ModelValue
ModelState.SetModelValue("due", new ValueProviderResult(
due.ToShortDateString(),
due.ToShortDateString(),
null));
Es un truco sucio, pero parece funcionar.
<%= Html.TextBoxFor(model => model.SomeDate,
new Dictionary<string, object> { { "Value", Model.SomeDate.ToShortDateString() } })%>
Obtiene el enlace del modelo y puede anular la propiedad de "valor" HTML del campo de texto con una cadena formateada.
Acabo de encontrar esta solución muy simple y elegante, disponible en MVC 2:
http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx
Básicamente si está utilizando MVC 2.0, use lo siguiente en su vista.
<%=Html.LabelFor(m => m.due) %>
<%=Html.EditorFor(m => m.due)%>
luego crea una vista parcial en / Views / Shared / EditorTemplates, llamada DateTime.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %>
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" }) %>
Cuando se llama al Editor For <>, encontrará una Plantilla de Editor correspondiente.
Decore la propiedad en su modelo con el atributo DataType
y especifique que es una Date
y no un DateTime
:
public class Model {
[DataType(DataType.Date)]
public DateTime? Due { get; set; }
}
También debe usar EditorFor
lugar de TextBoxFor
en la vista:
@Html.EditorFor(m => m.Due)
Creo que personalmente diría que es mejor o más fácil hacerlo a través de una página fuertemente tipada y alguna clase de modelo definida, pero si quieres que sea algo que viva en la carpeta, lo haría de esta manera:
public class SomeTypeBinder : IModelBinder
{
public object GetValue(ControllerContext controllerContext, string modelName,
Type modelType, ModelStateDictionary modelState)
{
SomeType temp = new SomeType();
//assign values normally
//If an error then add formatted date to ViewState
controllerContext.Controller.ViewData.Add("FormattedDate",
temp.Date.ToShortDateString());
}
}
Y luego usar eso en la vista al crear el cuadro de texto, es decir:
<%= Html.TextBox("FormattedDate") %>
Espero que ayude.
Esto funcionó para mí: mvc 2
<%: Html.TextBoxFor(m => m.myDate, new { @value = Model.myDate.ToShortDateString()}) %>
Simple y dulce!
Un comentario de user82646, pensé que lo haría más visible.
Prueba esto
<%:Html.TextBoxFor(m => m.FromDate, new { @Value = (String.Format("{0:dd/MM/yyyy}", Model.FromDate)) }) %>
MVC4 EF5 View Estaba intentando precargar un campo con la fecha de hoy y luego pasarlo a la vista para su aprobación.
ViewModel.SEnd = DateTime.Now //preload todays date
return View(ViewModel) //pass to view
En la vista, mi primer código permitió una edición:
@Html.EditedFor(item.SEnd) //allow edit
Más tarde lo cambié para solo mostrar la fecha, el usuario no puede cambiarlo pero el envío activa los cambios del controlador.
<td>
@Html.DisplyFor(item.SEnd) //show no edit
</td>
Cuando cambié a DisplayFor, tuve que agregar esto para asegurar que el valor precargado se transmitiera al controlador. También necesito agregar HiddenFor para cada campo en el modelo de vista.
@Html.HiddenFor(model => model.SEnd) //preserve value for passback.
Cosas para principiantes, pero tomó un tiempo resolver esto.
Primero, agregue esta extensión para obtener la ruta de la propiedad:
public static class ExpressionParseHelper
{
public static string GetPropertyPath<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> property)
{
Match match = Regex.Match(property.ToString(), @"^[^/.]+/.([^/(/)]+)$");
return match.Groups[1].Value;
}
}
Luego agregue esta extensión para HtmlHelper:
public static MvcHtmlString DateBoxFor<TEntity>(
this HtmlHelper helper,
TEntity model,
Expression<Func<TEntity, DateTime?>> property,
object htmlAttributes)
{
DateTime? date = property.Compile().Invoke(model);
var value = date.HasValue ? date.Value.ToShortDateString() : string.Empty;
var name = ExpressionParseHelper.GetPropertyPath(property);
return helper.TextBox(name, value, htmlAttributes);
}
También deberías agregar este código jQuery:
$(function() {
$("input.datebox").datepicker();
});
datepicker es un plugin jQuery.
Y ahora puedes usarlo:
<%= Html.DateBoxFor(Model, (x => x.Entity.SomeDate), new { @class = "datebox" }) %>