与@ Html.TextBoxFor()一起使用时,DisplayFormat属性的DataFormatString参数不起作用

时间:2013-07-23 21:13:36

标签: datetime asp.net-mvc-4 data-annotations string-formatting html-helper

我有一个带有一些日期和时间属性的模型。

时间属性具有以下DataAnnotation:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]

日期属性包含:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]

但是,只有在我使用@Html.EditorFor()而非@Html.TextBoxFor()时才会尊重这些。

我目前的情况不允许我使用EditorFor,那么如何强制TextBoxFor尊重这些格式字符串呢?

4 个答案:

答案 0 :(得分:14)

您可以尝试以下操作:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")

还有一个带有html属性的重载,所以你可以设置CSS类,连接datepickers等等:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })

答案 1 :(得分:0)

也许可以创建一个扩展方法:

    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?属性),虽然我不确定在运行时编译表达式是不是一个好主意。

答案 2 :(得分:0)

我为此做了一个选项:

@Html.TextBoxFor(m => m.Patient.DOB, new { @Value = string.Format("{0:MM/dd/yyyy}", Model.EndDate)  })

答案 3 :(得分:0)

在MVC5中,您可以调用视图中定义的显示格式,避免复制日期时间格式,只需按以下方式编码:

@Html.TextBoxFor(m => m.TotalAmount, Model.DOB.GetDateTimeFormats()[0])