Pregunta

Estoy usando ASP.NET MVC2 con MvcContrib.FluentHtml para realizar el enlace de formularios.

Quiero vincular un formato de fecha y hora a un cuadro de texto con un formato de fecha y hora específico.

<%=this.TextBox(c => c.date_a).Class("readonly text-box") %>
// PS. c.date_a is a DateTime

me da

<input type="text" value="5/9/2009 12:00:00 AM" name="date_a" id="datea" class="readonly text-box">

Sin embargo, me gustaría anular el formato de fecha y hora predeterminado.p.ej.

value="2009-5-9" 
value="9-5-09" 
value="09May9" 

Sé que puedo anular el valor mediante un valor específico; sin embargo, la fecha también debe vincularse a la clase de objeto en POST el formulario.

¿Cómo hacer un código "mínimo" para anular el formato de fecha y hora predeterminado de un campo específico en la interfaz de usuario?

¿Fue útil?

Solución

Con FluentHtml se puede hacer como esto:

<%=this.TextBox(c => c.date_a).Class("readonly text-box").Format("yyyy-M-d") %>

Otros consejos

No sé si esto funciona con MvcContrib MvcContrib.FluentHtml pero sin él, es muy simple, agréguelo a la propiedad de su modelo.

[DisplayFormat(DataFormatString="{0:MM/dd/yyyy}", ApplyFormatInEditMode=true)]

y en tu vista

m.DateProperty) %>

No sé si MvcContrib usa Atributos pero si no lo hace, debería hacerlo, de esa manera, siempre tendrás tu fecha en el mismo formato, especificando el formato solo una vez...

espero que esto ayude

En primer lugar, añadir esta extensión para obtener la ruta de propiedad:

public static string GetPropertyPath<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> property)
{                       
     Match match = Regex.Match(property.ToString(), @"^[^\.]+\.([^\(\)]+)$");
     return match.Groups[1].Value;
}

Que añadir las extensiones de este para HtmlHalper:

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 se debe añadir el código jQuery:

$(function() {
    $("input.datebox").datepicker();
});

datepicker es un plugin jQuery.

Y ahora se puede usar:

 <%= Html.DateBoxFor(Model, (x => x.Entity.SomeDate), new { @class = "datebox" }) %>

A menudo me encuentro con situaciones en las que es poco práctica para modificar el modelo (con atributos, etc) así que la posibilidad de implementar una solución como Сергій de es importante. A punto de Dennis Cheung embargo, puede enlazar con más fuerza esta solución de la siguiente manera:

public static MvcHtmlString DateBoxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> property)
{
    return helper.DateBoxFor(property, "d", null);
}

public static MvcHtmlString DateBoxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> property, string format, object htmlAttributes)
{
    var viewData = helper.ViewContext.ViewData;
    var date = property.Compile().Invoke(viewData.Model);
    var value = date.HasValue ? date.Value.ToString(format) : string.Empty;
    var name = viewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(property));

    return helper.TextBox(name, value, htmlAttributes);
}

A continuación, se llama así:

<%:Html.DateBoxFor(m => m.SomeDate)%>

O como esto:

<%:Html.DateBoxFor(m => m.SomeDate, "d", null)%>

No estoy seguro de si esto le causaría problemas cuando el valor se devuelve pero la siguiente sintaxis debe permitirle cambiar el formato con el que se muestra el valor de fecha.

<%=this.TextBox(c => c.date_a.ToString('yyyy-M-d')).Class("readonly text-box") %>

Puede encontrar más información sobre cómo construir las cadenas de formato aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top