DateTime字段和Html.TextBoxFor()帮助器。如何正确使用?

时间:2010-09-17 11:19:34

标签: asp.net-mvc html-helper

我的模型中有一个DateTime字段。如果我尝试以强类型局部视图的方式使用此字段

<%= 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; }

5 个答案:

答案 0 :(得分:23)

我在mvc 4中使用它。它也有效〜

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

答案 1 :(得分:19)

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

在你的模特中:

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

EditorFor的缺点是您无法将自定义html属性应用于生成的字段。作为替代方案,您可以使用TextBox帮助程序:

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

答案 2 :(得分: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) %>

将它放在Views / Shared / EditorTemplates文件夹中。现在打电话的时候:

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

您的日期时间将没有时间格式化。

这会以这种方式调用所有DateTimes,但是......

自定义html属性可以这种方式使用:

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

它作为ViewData传递给EditorTemplate。

答案 3 :(得分:2)

至少如果使用剃须刀,您可以为模板命名,因此您不需要对所有日期时间使用相同的模板:

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

其中Date.cshtml包含TextBoxFor或其他一些编辑器,如@JungleFreak所解释:

@model DateTime?

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

答案 4 :(得分: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可以是dateTime类型的扩展方法,它以所需的格式返回字符串值。

用法:

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

对我来说很好(对于DateTimeDateTime?属性),虽然我不确定在运行时编译表达式是不是一个好主意。