在绑定上格式化date(ASP.NET MVC)
在我的ASP.net MVC应用程序,我有一个看起来像这样的:
... <label>Due Date</label> <%=Html.TextBox("due")%> ...
我正在使用ModelBinder
将post绑定到我的模型(适当的属性是DateTime
types)。 问题是当我把“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.
初学者的东西,但它花了一段时间来解决这个问题。