2010-02-09 74 views
2

我使用ASP.NET MVC2和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上的特定字段的默认日期时间格式?

回答

0

随着FluentHtml你可以这样做:

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

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

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

你会发现在如何构造格式字符串here进一步的信息。

+0

我该如何captu使用TryUpdateModel以其他格式重新显示日期值? – 2010-02-09 08:54:24

+0

这不起作用。扩展方法中的lambda名称告诉FluentHtml如何绑定元素。 – 2010-08-05 15:13:34

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" }) %> 
+0

有趣的使用正则表达式。但有点麻烦。 – 2010-02-10 22:09:54

+0

我不明白它如何与绑定。任何人都能解释? – 2010-02-11 01:31:38

+1

它只是创建一个正确的名称。这就是你需要将输入绑定到模型的字段。 – Serhiy 2010-02-17 16:17:28

9

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

[DisplayFormat(DataFormatString = “{0:MM/DD/YYYY}”,ApplyFormatInEditMode =真)]

和在视图

m.DateProperty)%>

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

希望这有助于

+0

据我所知 - 事实并非如此。 – 2010-02-10 22:07:28

+0

我会采用这种方法,除非你的意思是域模型(而不是视图模型)。 – 2010-02-10 22:11:30

+0

它看起来很干净而且很好,但是,我正在使用LINQ2SQL,它很难在生成的代码中将DisplayFormatAttribute添加到属性中。 – 2010-02-11 01:27:50

1

我经常碰到的情况下这是不切实际的修改模型(带属性等),所以能够实现解决方案一样Сергій的是很重要的。

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)%>