我的模型中有一个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; }
答案 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)
对我来说很好(对于DateTime
和DateTime?
属性),虽然我不确定在运行时编译表达式是不是一个好主意。