2010-02-09 72 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)%>