ASP.NET MVC2和DateTime格式

时间:2010-02-09 08:42:56

标签: asp.net-mvc data-binding asp.net-mvc-2 datetime-format

我使用ASP.NET MVC2和MvcContrib.FluentHtml来进行表单绑定。

我想将DateTime格式绑定到具有特定日期时间格式的文本框。

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

给了我

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

但是,我想覆盖默认的日期时间格式。 例如

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

我知道我可以通过特定的值覆盖值,但是,日期也应该绑定到POST表单上的对象类。

如何使用“最小”代码覆盖UI上特定字段的默认日期时间格式?

5 个答案:

答案 0 :(得分:9)

我不知道这是否适用于MvcContrib MvcContrib.FluentHtml但没有它,它非常简单,添加到您的模型属性

  

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

并在您的视图中

   m.DateProperty)%&gt;

我不知道MvcContrib是否使用了属性,但如果没有,那么就应该这样,你总是让你的日期格式相同,只指定格式一次......

希望这个帮助

答案 1 :(得分:1)

首先,添加此扩展名以获取属性路径:

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

为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);
        }

此外,您应该添加此jQuery代码:

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

datepicker是一个jQuery插件。

现在你可以使用它了:

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

答案 2 :(得分:1)

我经常遇到修改模型(使用属性等)不切实际的情况,因此能够实现像Сергій这样的解决方案非常重要。但是,对于Dennis Cheung来说,您可以按如下方式更紧密地绑定此解决方案:

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);
}

然后你这样称呼它:

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

或者像这样:

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

答案 3 :(得分:0)

我不确定在回发该值时是否会导致问题,但以下语法应允许您更改显示日期值的格式。

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

您将找到有关如何构建格式字符串here的更多信息。

答案 4 :(得分:0)

使用FluentHtml,您可以这样做:

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