2

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の特定のフィールドのデフォルトの日時形式をオーバーライドする「最小限の」コードを実行するにはどうすればよいですか?

4

5 に答える 5

9

これが MvcContrib MvcContrib.FluentHtml で機能するかどうかはわかりませんが、それがなければ非常に簡単で、モデルプロパティに追加します

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

そしてあなたの見解では

m.DateProperty) %>

MvcContrib が Attributes を使用しているかどうかはわかりませんが、使用していない場合は、そのようにして、日付を常に同じ形式にし、形式を一度だけ指定する必要があります...

この助けを願っています

于 2010-02-10T21:58:03.423 に答える
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" }) %>
于 2010-02-10T15:55:26.973 に答える
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)%>
于 2010-06-30T16:50:49.673 に答える
0

FluentHtml を使用すると、次のように実行できます。

<%=this.TextBox(c => c.date_a).Class("readonly text-box").Format("yyyy-M-d") %>
于 2010-08-05T15:13:42.670 に答える
0

値がポストバックされたときにこれが問題を引き起こすかどうかはわかりませんが、次の構文を使用すると、日付値が表示される形式を変更できるはずです。

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

フォーマット文字列の作成方法の詳細については、こちらを参照してください。

于 2010-02-09T08:53:10.183 に答える