web-dev-qa-db-ja.com

ASP.Net MVC DisplayFormat

私のモデルでは、プロパティの1つに次のDataAnnotationsがあります

[Required(ErrorMessage = "*")]
[DisplayFormat(DataFormatString = "{0:d}")]
[DataType(DataType.Date)]
public DateTime Birthdate { get; set; }

必要な注釈はうまく機能し、他の2つを追加して時間を削除しようとしました。を使用してビューの入力にバインドされます

<%=Html.TextBoxFor(m => m.Birthdate, new { @class = "middle-input" })%>

ただし、ビューが読み込まれるたびに、入力ボックスに時間が表示されます。とにかくDataAnnotationsを使用してこれを削除する方法はありますか?

47
Gavin

[DisplayFormat]属性はEditorFor/DisplayForでのみ使用され、TextBoxForなどの生のHTML APIでは使用されません。

88
Brad Wilson

ブラッドが言ったように、TextBoxForでは機能しませんが、EditorForで機能させるには、ApplyFormatInEditModeを追加することも忘れないでください。

[DataType(DataType.Date), DisplayFormat( DataFormatString="{0:dd/MM/yy}", ApplyFormatInEditMode=true )]
public System.DateTime DateCreated { get; set; }

次に使用する

@Html.EditorFor(model => model.DateCreated)
28
Paul Johnson

私の問題はいくつかのhtml属性(jquery-datepicker)を設定することでしたので、EditorForは私にとって選択肢ではありませんでした。

カスタムヘルパーメソッドを実装することで問題が解決しました。

DateTimeプロパティを持つModelClass:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime CustomDate{ get; set; }

ModelClassをモデルとして表示:

@Html.TextBoxWithFormatFor(m => m.CustomDate, new Dictionary<string, object> { { "class", "datepicker" } })

静的ヘルパークラスのヘルパーメソッド:

public static class HtmlHelperExtension {
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        return htmlHelper.TextBox(htmlHelper.ViewData.TemplateInfo.GetFullHtmlFieldName(metadata.PropertyName), string.Format(metadata.DisplayFormatString, metadata.Model), htmlAttributes);
    }
}
8
Tobias