ASP.NET Формат MVC2 и даты и времени
-
19-09-2019 - |
Вопрос
Я использую ASP.NET MVC2 с MvcContrib.FluentHtml для выполнения привязки к форме.
Я хочу привязать формат DateTime к текстовому полю с определенным форматом 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">
Однако я бы хотел переопределить формат datetime по умолчанию.например ,
value="2009-5-9"
value="9-5-09"
value="09May9"
Я знаю, что могу переопределить значение, указав значение a, однако дата также должна быть привязана к классу объекта при ПУБЛИКАЦИИ формы.
Как выполнить "минимальный" код, чтобы переопределить формат даты и времени по умолчанию для определенного поля в пользовательском интерфейсе?
Решение
С помощью FluentHtml вы можете сделать следующее:
<%=this.TextBox(c => c.date_a).Class("readonly text-box").Format("yyyy-M-d") %>
Другие советы
Я не знаю, работает ли это с MvcContrib MvcContrib.FluentHtml но без него это очень просто, добавьте в свое свойство model
[DisplayFormat(DataFormatString="{0:ММ/дд/гггг}", ApplyFormatInEditMode=true)]
и на ваш взгляд
m.Свойство DateProperty) %>
Я не знаю, использует ли MvcContrib атрибуты, но если это не так, то так и должно быть, таким образом, ваша дата всегда будет иметь один и тот же формат, указав формат только один раз...
надеюсь, это поможет
Во-первых, добавьте это расширение для получения пути к свойству:
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" }) %>
Я часто сталкиваюсь с ситуациями, когда нецелесообразно изменять модель (с атрибутами и т.д.), Поэтому важно иметь возможность реализовать решение, подобное Сергй's.Однако, по мнению Денниса Чанга, вы можете более жестко связать это решение следующим образом:
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)%>
Я не уверен, вызовет ли это у вас проблемы при возврате значения, но следующий синтаксис должен позволить вам изменить формат, в котором отображается значение даты.
<%=this.TextBox(c => c.date_a.ToString('yyyy-M-d')).Class("readonly text-box") %>
Вы найдете дополнительную информацию о том, как создавать строки формата здесь.