Вопрос

Я использую 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") %>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top