我使用ASP.NET MVC2和MvcContrib.FluentHtml来进行表单绑定。
我想将DateTime格式绑定到具有特定日期时间格式的文本框。
<%=this.TextBox(c => c.date_a).Class("readonly text-box") %>
// PS. c.date_a is a DateTime
给了我
<input type="text" value="5/9/2009 12:00:00 AM" name="date_a" id="datea" class="readonly text-box">
但是,我想覆盖默认的日期时间格式。 例如
value="2009-5-9"
value="9-5-09"
value="09May9"
我知道我可以通过特定的值覆盖值,但是,日期也应该绑定到POST表单上的对象类。
如何使用“最小”代码覆盖UI上特定字段的默认日期时间格式?
答案 0 :(得分:9)
我不知道这是否适用于MvcContrib MvcContrib.FluentHtml但没有它,它非常简单,添加到您的模型属性
[DisplayFormat(DataFormatString =“{0:MM / dd / yyyy}”,ApplyFormatInEditMode = true)]
并在您的视图中
m.DateProperty)%&gt;
我不知道MvcContrib是否使用了属性,但如果没有,那么就应该这样,你总是让你的日期格式相同,只指定格式一次......
希望这个帮助
答案 1 :(得分:1)
首先,添加此扩展名以获取属性路径:
public static string GetPropertyPath<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> property)
{
Match match = Regex.Match(property.ToString(), @"^[^\.]+\.([^\(\)]+)$");
return match.Groups[1].Value;
}
为HtmlHalper添加此扩展名:
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" }) %>
答案 2 :(得分:1)
我经常遇到修改模型(使用属性等)不切实际的情况,因此能够实现像Сергій这样的解决方案非常重要。但是,对于Dennis Cheung来说,您可以按如下方式更紧密地绑定此解决方案:
public static MvcHtmlString DateBoxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> property)
{
return helper.DateBoxFor(property, "d", null);
}
public static MvcHtmlString DateBoxFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> property, string format, object htmlAttributes)
{
var viewData = helper.ViewContext.ViewData;
var date = property.Compile().Invoke(viewData.Model);
var value = date.HasValue ? date.Value.ToString(format) : string.Empty;
var name = viewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(property));
return helper.TextBox(name, value, htmlAttributes);
}
然后你这样称呼它:
<%:Html.DateBoxFor(m => m.SomeDate)%>
或者像这样:
<%:Html.DateBoxFor(m => m.SomeDate, "d", null)%>
答案 3 :(得分:0)
我不确定在回发该值时是否会导致问题,但以下语法应允许您更改显示日期值的格式。
<%=this.TextBox(c => c.date_a.ToString('yyyy-M-d')).Class("readonly text-box") %>
您将找到有关如何构建格式字符串here的更多信息。
答案 4 :(得分:0)
使用FluentHtml,您可以这样做:
<%=this.TextBox(c => c.date_a).Class("readonly text-box").Format("yyyy-M-d") %>