2010-09-17 91 views
21

我的模型中有一個DateTime字段。如果我嘗試在一個強類型的局部視圖這種方式來使用此字段DateTime字段和Html.TextBoxFor()助手。如何正確使用它?

<%= Html.TextBoxFor(model => model.DataUdienza.ToString("dd/MM/yyyy"), new { style = "width: 120px" }) %> 

我會在運行時得到以下編譯錯誤

System.InvalidOperationException : Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions. 

無論如何,如果我用它去除格式,的ToString( 「dd/MM/yyyy」),一切正常,但該字段使用我根本不需要的時間部分格式化。

我在哪裏做錯了?哪個是正確的處理方法?

感謝您的幫助!

編輯

這是模型類

[Required] 
[DisplayName("Data Udienza")] 
[DataType(DataType.Date)] 
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] 
public DateTime DataUdienza { get; set; } 

回答

12

創建一個名爲DateTime.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %> 
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToString("MM/dd/yyyy") : string.Empty), ViewData) %> 

編輯模板,把它放在你的意見/共享/ EditorTemplates文件夾。現在,當你撥打電話:

<%= Html.EditorFor(model => model.DataUdienza) %> 

你的日期時間格式化沒有時間。

這將名爲這種方式,所有DateTime是否發生,但...

自定義HTML屬性可以用這種方式來使用:

<%= Html.EditorFor(model => model.DataUdienza, new {customAttr = "custom", @class = "class"}) %> 

它貫穿於EditorTemplate作爲ViewData的。

19
<%= Html.EditorFor(model => model.DataUdienza) %> 

而在模型中的財產申報:

[DisplayFormat(ApplyFormatInEditMode = true, 
       DataFormatString = "{0:MM/dd/yyyy}")] 
public DateTime DataUdienza { get; set; } 

災難恢復與EditorFor的awback是你不能將自定義html屬性應用到生成的字段。作爲替代,你可以使用TextBox幫手:

<%= Html.TextBox("DataUdienza", Model.Date.ToString("dd/MM/yyyy"), new { style = "width: 120px" })%> 
+0

哇!超級快。謝謝:)我要試一試。但是,與此同時,如果該字段是Nullable類型,它是如何工作的? – Lorenzo 2010-09-17 11:24:28

+0

對於可空類型,其工作方式相同。 – 2010-09-17 11:27:35

+0

我試圖應用您的解決方案,但不幸的是does not工作。我將編輯帖子,爲您的信息添加模型屬性聲明。 – Lorenzo 2010-09-17 11:30:42

20

我用這個在MVC 4.它也可以〜

@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" }) 
+1

感謝非常好的解決方案。但我真的需要明白爲什麼它沒有使用web配置中指定的設置的文化信息。 – Desmond 2012-12-19 10:11:44

+0

這爲我做了這份工作,謝謝! – 2013-10-26 00:30:13

2

至少如果使用剃鬚刀,你可以命名模板,這樣你就不需要使用相同的模板所有DateTime是否:

@Html.EditorFor(m => m.StartDate, "Date") 

其中日期。CSHTML包含TextBoxFor或一些其他編輯器,像@JungleFreak曾解釋:

@model DateTime? 

@Html.TextBox("", Model.HasValue ? Model.Value.ToShortDateString() : string.Empty, 
    new { data_datepicker = true }) 
1

也許可以創建一個擴展方法:

public static MvcHtmlString DateTimeFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
    { 
     var compilationResult = expression.Compile(); 
     TValue dateValue = compilationResult((TModel)html.ViewDataContainer.ViewData.Model); 
     var body = (MemberExpression)expression.Body; 
     return html.TextBox(body.Member.Name, (Convert.ToDateTime(dateValue)).ToCustomDateFormat(), new { id = body.Member.Name, datepicker = true }); 
    } 

方法ToCustomDateFormat可能是時間類型返回的擴展方法所需格式的字符串值。

用法:

@Html.DateTimeFor(x=>x.AnyDateTimeProperty) 

工作得很好,我(爲DateTimeDateTime?屬性),雖然我不知道,如果在編譯運行時的表達是一個好主意。

相關問題