将日期时间模型属性显示为短日期时间字符串

时间:2011-02-21 21:45:52

标签: c# asp.net-mvc asp.net-mvc-2

我是MVC2的新手,我遇到了格式化问题。我的Employee模型中有一个DateTime属性,我想用短日期时间显示。

然而,这似乎不是正确的方法。

1 <div class="editor-field">
2    <%: Html.TextBoxFor(model => model.DateRequested.ToShortDateString()) %>
3    <%: Html.ValidationMessageFor(model => model.DateRequested) %>
4 </div>

第2行抛出此异常:

  

模板只能用于字段   访问,财产访问,   单维数组索引,或   单参数自定义索引器   表达式。

在mvc中处理格式化的正确方法是什么?

2 个答案:

答案 0 :(得分:28)

尝试使用[DisplayFormat]属性装饰视图模型属性:

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public DateTime DateRequested { get; set; };

并在您的视图中使用Html.EditorFor帮助程序:

<div class="editor-field">
    <%: Html.EditorFor(model => model.DateRequested) %>
    <%: Html.ValidationMessageFor(model => model.DateRequested) %>
</div>

或者如果你坚持使用文本框助手(不知道为什么你会这样,但无论如何):

<div class="editor-field">
    <%: Html.TextBox("DateRequested", Model.DateRequested.ToShortDateString()) %>
    <%: Html.ValidationMessageFor(model => model.DateRequested) %>
</div>

答案 1 :(得分:2)

如果您想坚持使用html辅助方法,请尝试以下方法:

public static MvcHtmlString TextBoxDateTime<TModel>(this HtmlHelper<TModel> helper,
             Expression<Func<TModel, DateTime>> expression, int tabIndex = 1)
    {
        var meta = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
        var propertyName = ExpressionHelper.GetExpressionText(expression);

        var input = new TagBuilder("input");
        input.MergeAttribute("id",
                             helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldId(propertyName)));
        input.MergeAttribute("name",
                             helper.AttributeEncode(
                                 helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)));
        input.MergeAttribute("value", ((DateTime)meta.Model).ToShortDateString());
        input.MergeAttribute("type", "text");
        input.MergeAttribute("class", "text cal");
        input.MergeAttribute("tabindex", tabIndex.ToString());
        input.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), meta));
        return MvcHtmlString.Create(input.ToString());
    }