ASP.NET MVC2 и формат DateTime - PullRequest
       35

ASP.NET MVC2 и формат DateTime

2 голосов
/ 09 февраля 2010

Я использую 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 форме.

Как сделать «минимальный» код для переопределения формата даты и времени по умолчанию для определенного поля в пользовательском интерфейсе?

Ответы [ 5 ]

9 голосов
/ 11 февраля 2010

Я не знаю, работает ли это с MvcContrib MvcContrib.FluentHtml, но без него очень просто добавить свойство вашей модели

[DisplayFormat (DataFormatString = "{0: MM / дд / гггг}", ApplyFormatInEditMode = true)]

и по вашему мнению

m.DateProperty)%>

Я не знаю, использует ли MvcContrib Атрибуты, но если нет, то таким образом вы всегда будете иметь дату в одном формате, указав формат только один раз ...

надеюсь, что это поможет

1 голос
/ 30 июня 2010

Я часто сталкиваюсь с ситуациями, когда нецелесообразно модифицировать модель (с атрибутами и т. Д.), Поэтому очень важно иметь возможность реализовать решение, подобное Сергию. Однако, к точке Денниса Ченга, вы можете более тесно связать это решение следующим образом:

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)%>
1 голос
/ 10 февраля 2010

Сначала добавьте это расширение для получения пути к свойству:

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" }) %>
0 голосов
/ 05 августа 2010

С FluentHtml вы можете сделать так:

<%=this.TextBox(c => c.date_a).Class("readonly text-box").Format("yyyy-M-d") %>
0 голосов
/ 09 февраля 2010

Я не уверен, может ли это вызвать проблемы при отправке значения обратно, но следующий синтаксис должен позволить вам изменить формат отображения значения даты.

<%=this.TextBox(c => c.date_a.ToString('yyyy-M-d')).Class("readonly text-box") %>

Дополнительную информацию о том, как построить строки формата *, вы найдете здесь здесь .

...