Asp.net mvc DateTime字段和Html.TextBoxFor()帮助程序。如何正确使用它?

Asp.net mvc DateTime字段和Html.TextBoxFor()帮助程序。如何正确使用它?,asp.net-mvc,html-helper,Asp.net Mvc,Html Helper,我的模型中有一个DateTime字段。如果我尝试以这种方式在强类型局部视图中使用此字段 <%= Html.TextBoxFor(model => model.DataUdienza.ToString("dd/MM/yyyy"), new { style = "width: 120px" }) %> 无论如何,如果我使用它删除格式设置,ToString(“dd/MM/yyyyy”),一切都正常,但字段的格式设置使用了我根本不需要的时间部分 我哪里做错了?处理这个问题的正确方法

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

<%= Html.TextBoxFor(model => model.DataUdienza.ToString("dd/MM/yyyy"), new { style = "width: 120px" })  %>
无论如何,如果我使用它删除格式设置,ToString(“dd/MM/yyyyy”),一切都正常,但字段的格式设置使用了我根本不需要的时间部分

我哪里做错了?处理这个问题的正确方法是什么

谢谢你的帮助

编辑

这是模型类中的属性声明

[Required]
[DisplayName("Data Udienza")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime DataUdienza { get; set; }

EditorFor的缺点是无法将自定义html属性应用于生成的字段。您也可以使用
文本框
帮助程序:

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

创建名为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) %>
model.DataUdienza)%%>
您的DateTime格式将不包含时间

这种情况会发生在所有被称为这种方式的日期时间上,不过

自定义html属性可以通过以下方式使用:

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

它作为ViewData传递到编辑器模板。

我在MVC4中使用它。它也起作用~

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

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

@Html.EditorFor(m=>m.StartDate,“日期”)
其中Date.cshtml包含TextBoxFor或其他编辑器,如@JungleFreak所解释的:

@model DateTime?
@Html.TextBox(“”,Model.HasValue?Model.Value.ToSortDateString():string.Empty,
新{data_datepicker=true})

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

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

Wow!超高速。谢谢:)我要试试。但是,同时,如果字段是可空类型,这是如何工作的?对于可空类型也是如此。我已经尝试应用您的解决方案,但不幸的是,没有工作。我将编辑这篇文章,为您添加模型属性声明。@Lorenzo,您是否注意到应该使用
Html.EditorFor
而不是
Html.TextBoxFor
?@Darin:我以前从未使用过EditorFor。无论如何,请考虑这两个属性(DATA和DISPLAY格式)已被添加到现在尝试您的建议。非常好的解决方案。但是我真的需要看看为什么它没有使用web配置中指定的设置的区域性信息。
<%= Html.EditorFor(model => model.DataUdienza, new {customAttr = "custom", @class = "class"}) %>
@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" })
    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 });
    }
@Html.DateTimeFor(x=>x.AnyDateTimeProperty)