2

我正在使用带有 MvcContrib.FluentHtml 的 ASP.NET MVC2 来进行表单绑定。

我想将 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 上特定字段的默认日期时间格式?

4

5 回答 5

9

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

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

在你看来

m.DateProperty) %>

我不知道 MvcContrib 是否使用属性,但如果没有,它应该,这样,你的日期将始终具有相同的格式,只指定一次格式......

希望这有帮助

于 2010-02-10T21:58:03.423 回答
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" }) %>
于 2010-02-10T15:55:26.973 回答
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)%>
于 2010-06-30T16:50:49.673 回答
0

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

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

您将在此处找到有关如何构造格式字符串的更多信息。

于 2010-02-09T08:53:10.183 回答
0

使用 FluentHtml 你可以这样做:

<%=this.TextBox(c => c.date_a).Class("readonly text-box").Format("yyyy-M-d") %>
于 2010-08-05T15:13:42.670 回答