Datetime 显示格式属性';与@Html.TextBoxFor()一起使用时,s DataFormatString参数不起作用

Datetime 显示格式属性';与@Html.TextBoxFor()一起使用时,s DataFormatString参数不起作用,datetime,asp.net-mvc-4,data-annotations,string-formatting,html-helper,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.T

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

时间属性具有以下DataAnnotation:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
日期属性为:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
但是,只有当我使用
@Html.EditorFor()
而不是
@Html.TextBoxFor()
时,才会考虑这些问题


我目前的情况不允许我使用
编辑器for
,因此如何强制
文本框for
遵守这些格式字符串?

您可以尝试以下操作:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")
还有一个重载,它接受html属性,因此您可以设置CSS类、连接日期选择器等:

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

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

    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 });
    }

这样,所有datetime变量的格式都可以通过单个函数进行控制。对我来说效果很好(对于
DateTime
DateTime?
属性),尽管我不确定在运行时编译表达式是否是个好主意。

我为此做了一个选择:

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

在MVC5中,您可以调用视图中定义的显示格式,避免重复datetime格式,只需按以下方式编码即可:

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

为什么必须使用
TextBoxFor
?使用
EditorFor
s验证无法正常工作。我们一直在调查,但没有发现任何问题。验证可能与您在应用程序中使用的
CultureInfo
有关。您能详细说明一下吗?正如我提到的,这可能是由于您环境的语言和日期时间设置造成的为什么
@class=“input large”
?只是说您可以应用您的样式。例如jquery日期选择器。我想我最终会坚持这个解决方案。我使用的是MVC5,有同样的问题,但上面的解决方案不起作用@Html.LabelFor(model=>model.DateOfBirth,htmlAttributes:new{@class=“control label col-md-2”})@Html.TextBoxFor(model=>model.DateOfBirth,“{0:dd MM yyyy}”,new{htmlAttributes=new{@class=“form control”})@Html.ValidationMessageFor(model=>model.DateOfBirth,”,new{@class=“文本危险”})`
@Html.TextBoxFor(m => m.TotalAmount, Model.DOB.GetDateTimeFormats()[0])