在绑定上格式化date(ASP.NET MVC)

在我的ASP.net MVC应用程序,我有一个看起来像这样的:

... <label>Due Date</label> <%=Html.TextBox("due")%> ... 

我正在使用ModelBinder将post绑定到我的模型(适当的属性是DateTimetypes)。 问题是当我把“01/01/2009”放入文本框,并且post不validation(由于其他数据input不正确)。 资料夹重新填充date和时间 “01/01/2009 00:00:00 ”。

有什么办法来告诉联编程序正确格式化date(即ToShortDateString() )?

我刚刚遇到了这个非常简单和优雅的解决scheme,在MVC 2中可用:

http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx

基本上如果你使用MVC 2.0,在你的视图中使用以下内容。

  <%=Html.LabelFor(m => m.due) %> <%=Html.EditorFor(m => m.due)%> 

然后在/ Views / Shared / EditorTemplates中创build一个名为DateTime.ascx的局部视图

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %> <%=Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" }) %> 

当EditorFor <>被调用时,它会find一个匹配的编辑器模板。

使用DataType属性装饰模型中的属性,并指定它的Date ,而不是DateTime

 public class Model { [DataType(DataType.Date)] public DateTime? Due { get; set; } } 

您必须在视图中使用EditorFor而不是TextBoxFor

 @Html.EditorFor(m => m.Due) 

这是一个肮脏的黑客,但似乎工作。

 <%= Html.TextBoxFor(model => model.SomeDate, new Dictionary<string, object> { { "Value", Model.SomeDate.ToShortDateString() } })%> 

您可以获得模型绑定,并且可以用格式化的string覆盖文本字段的HTML“value”属性。

我自己寻找答案时发现了这个问题。 上面的解决scheme不适合我,因为我的date时间是可空的。 以下是我如何解决它支持可空的DateTime对象。

 <%= Html.TextBox(String.Format("{0:d}", Model.Property)) %> 

你为什么不使用

 <% =Html.TextBox("due", Model.due.ToShortDateString()) %> 

首先,添加此扩展名以获取属性path:

 public static class ExpressionParseHelper { public static string GetPropertyPath<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> property) { Match match = Regex.Match(property.ToString(), @"^[^\.]+\.([^\(\)]+)$"); return match.Groups[1].Value; } } 

为HtmlHelper添加此扩展名:

  public static MvcHtmlString DateBoxFor<TEntity>( this HtmlHelper helper, TEntity model, Expression<Func<TEntity, DateTime?>> property, object htmlAttributes) { DateTime? date = property.Compile().Invoke(model); var value = date.HasValue ? date.Value.ToShortDateString() : string.Empty; var name = ExpressionParseHelper.GetPropertyPath(property); return helper.TextBox(name, value, htmlAttributes); } 

你也应该添加这个jQuery代码:

 $(function() { $("input.datebox").datepicker(); }); 

datepicker是一个jQuery插件。

现在你可以使用它:

 <%= Html.DateBoxFor(Model, (x => x.Entity.SomeDate), new { @class = "datebox" }) %> 

ASP.NET MVC2和DateTime格式

为了在你的视图后面的代码中获得对你的模型的强types访问,你可以这样做:

 public partial class SomethingView : ViewPage<T> { } 

其中T是您想要从您的操作传入的ViewDatatypes。

然后在你的控制器中你会有一个动作:

 public ActionResult Something(){ T myObject = new T(); T.Property = DateTime.Today(); Return View("Something", myObject); } 

之后,您可以在视图中input强types模型数据,以便您可以:

 <label>My Property</label> <%=Html.TextBox(ViewData.Model.Property.ToShortDateString())%> 

我发现最好的方法是重置ModelValue

 ModelState.SetModelValue("due", new ValueProviderResult( due.ToShortDateString(), due.ToShortDateString(), null)); 

我个人认为我会说它是最好的或最简单的通过一个强types页面和一些定义的模型类来做到这一点,但如果你希望它是活页夹中的东西,我会这样做:

 public class SomeTypeBinder : IModelBinder { public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState) { SomeType temp = new SomeType(); //assign values normally //If an error then add formatted date to ViewState controllerContext.Controller.ViewData.Add("FormattedDate", temp.Date.ToShortDateString()); } } 

然后在创build文本框时在视图中使用它:

 <%= Html.TextBox("FormattedDate") %> 

希望有所帮助。

这对我有用:mvc 2

<%: Html.TextBoxFor(m => m.myDate, new { @value = Model.myDate.ToShortDateString()}) %>

简单而甜蜜!

用户82646的评论,认为我会更明显。

尝试这个

 <%:Html.TextBoxFor(m => m.FromDate, new { @Value = (String.Format("{0:dd/MM/yyyy}", Model.FromDate)) }) %> 

MVC4 EF5视图我试图预先加载一个字段与今天的date,然后传递给审批的意见。

 ViewModel.SEnd = DateTime.Now //preload todays date return View(ViewModel) //pass to view 

在视图中,我的第一个代码允许编辑:

 @Html.EditedFor(item.SEnd) //allow edit 

后来我改变它只显示date,用户不能改变它,但提交触发控制器保存更改

  <td> @Html.DisplyFor(item.SEnd) //show no edit </td> 

当我更改为DisplayFor我需要添加此以确保预加载值传回给控制器。 我还需要为viewmodel中的每个字段添加HiddenFor。

  @Html.HiddenFor(model => model.SEnd) //preserve value for passback. 

初学者的东西,但它花了一段时间来解决这个问题。