ASP.NET MVC 3で特定の形式でDateTimeをレンダリングする方法


117

モデルクラスにタイプタイプのプロパティがあるDateTime場合、どのように特定の形式(たとえば、ToLongDateString()返される形式)でレンダリングできますか?

私はこれを試しました...

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

...式はプロパティまたはフィールドを指す必要があるため、例外がスローされます。この...

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

...これは例外をスローしませんが、レンダリングされた出力は空です(ただしval、デバッガーで確認できるように、期待値が含まれています)。

事前にヒントをありがとう!

編集する

ToLongDateString例にすぎません。代わりに実際に使用したいのToLongDateStringは、DateTimeおよびのカスタム拡張メソッドですDateTime?

public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
    if (dateTime.TimeOfDay == TimeSpan.Zero)
        return dateTime.ToString("d");
    else
        return dateTime.ToString("g");
}

public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
    if (dateTime.HasValue)
        return dateTime.Value.FormatDateTimeHideMidNight();
    else
        return "";
}

そのため、ViewModelプロパティでDisplayFormat属性とDataFormatStringパラメーターを使用できないと思います。

回答:


159

日付を特定の形式で表示するだけの場合は、次のように呼び出します。

@String.Format(myFormat, Model.MyDateTime)

@Html.DisplayFor(...)テンプレートを指定している場合や、テンプレートに基づいて構築されているものを使用する必要がある場合を除いて、使用は単なる追加作業ですIEnumerable<T>。テンプレートの作成は非常に簡単で、柔軟性も大幅に向上します。という名前の現在のコントローラー(または共有ビューフォルダー)のフォルダーをビューフォルダーに作成しますDisplayTemplates。そのフォルダー内に、テンプレートを作成するモデルタイプを含む部分ビューを追加します。この場合/Views/Shared/DisplayTemplates、と呼ばれる部分的なビューを追加して追加しましたShortDateTime.cshtml

@model System.DateTime

@Model.ToShortDateString()

そして、次の行でそのテンプレートを呼び出すことができます。

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")

おかげで、これは見栄えがよく、このテンプレートパラメータ( "ShortDateTime")は、ataddeiniの回答に対するコメントで説明した問題も解決します。
Slauma、

3
タイプが「DateTime?」の場合 「DateTime」の代わりに(@model DateTime?)... ciplayテンプレートはnull可能またはnull不可の日時を処理します。ファイル名は「DateTime.cshtml」のままにしてください。
ロミア、2011年

+1これについてコメントする必要がありましたが、私のアプリケーションではうまくいきました!ありがとう!
ラッセルクリステンセン

@ Html.DisplayFor()を使用するのは余計な作業ではなく、テンプレートがなくてもモデルのHTML表現をレンダリングします...混乱しないでください...
Cabuxa.Mapache

stackoverflow.com/questions/19920603/…には、@ Romiasが言及しているnull許容日時の処理に役立つコードが含まれています。
Walter de Jong

171

次の[DisplayFormat]属性でビューモデルプロパティを装飾できます。

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
               ApplyFormatInEditMode = true)]
public DateTime MyDateTime { get; set; }

そしてあなたの見解では:

@Html.EditorFor(x => x.MyDate)

または、値を表示するには、

@Html.DisplayFor(x => x.MyDate)

私がお勧めしない別の可能性は、弱く型付けされたヘルパーを使用することです:

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())

1
@ダーリン:入力要素は必要ありませんが、静的テキスト出力のみが必要です。また、実際の形式はDateTime(ToLongDateStringは単なる例である)のカスタム拡張メソッドによって作成されるため、を使用できる可能性は低いと述べておきますDataFormatString
スラウマ

2
@Slauma、いかがですか@Html.DisplayFor(x => x.MyDateTime)。@NickLarsenは、ビューモデルを使用する必要がある理由です。私の例では、この属性でビューモデルを装飾します。ビューは既に特定のビューに関連付けられています。それが目的です。
Darin Dimitrov、

1
@ Slauma、OK、この場合、カスタム表示テンプレートを使用するか、ビューモデルに文字列プロパティを使用させることができ、モデルとビューモデルの間でマッピングするときに、マッピングレイヤーで変換が行われます(これにより、ただし、ビューではHtml.DisplayForのみを使用してください)。
Darin Dimitrov、

5
@NickLarsen、いや、それはビューごとに1つのビューモデルです。あるコントローラーアクションの検証から一部のプロパティを除外し、他のアクションでは除外しない方法のような質問は、この間違いを犯すためです。SOでは非常に一般的です。
Darin Dimitrov、

1
1年後にこの質問に戻ると、ビューごとに1つのモデルの議論に同意します。ただし、表示の選択を処理するものはすべて、ビューではなくモデルに属していると思います。
Nick Larsen

26

モデル内の単純なフォーマット済み出力

@String.Format("{0:d}", model.CreatedOn)

またはforeachループで

@String.Format("{0:d}", item.CreatedOn)

使用の受け入れられた回答の複製のようですstring.Format
Paul Tyng

2
@PaulTyngこの回答は、私にとって受け入れられた回答よりも明確でした。odesukは、実際には、newbとして役立つ最初のパラメーターの形式を示しました。
Dan Beaulieu

1
私は同意します、これは私を助けた答えです。
グレンガーソン2017年

26

次のアプローチを使用してインライン形式にして、モデルの日付プロパティを表示します。

@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")

それ以外の場合は、TextBoxまたはエディターにデータを入力するときに、@ Darinが推奨するように、属性を属性で装飾し[DisplayFormat]ます。


これが私が探している解決策です!
邪悪な

これは私が探していた解決策です!
Raihan Ridoy 2018

9

すべてのDateTimeタイプが同じ方法でレンダリングされる場合は、カスタムDateTime表示テンプレートを使用できます。

Viewsフォルダーで、コントローラー固有のビューフォルダーまたは「共有」フォルダーの下に「DisplayTemplates」という名前のフォルダーを作成します(これらはパーシャルと同様に機能します)。

インサイドという名前のファイルを作成DateTime.cshtmlとるDateTimeよう@model、あなたの日付をレンダリングする方法とコードを:

@model System.DateTime
@Model.ToLongDateString()

これで、ビューでこれを使用するだけで機能するはずです。

@Html.DisplayFor(mod => mod.MyDateTime)

「DisplayTemplates」フォルダーに追加し、表示しているタイプと一致するようにファイルに名前を付けるという規則に従っている限り、MVCは自動的にそれを使用して値を表示します。これは、「EditorTemplates」を使用してシナリオを編集する場合にも機能します。

テンプレートの詳細については、こちらをご覧ください


おかげで、私はそれをテストしたところ、タイプが本当にであれば問題なく動作しましたDateTime。ただし、いくつかのnull可能なDateTimeプロパティがあります。私は、第二のファイルを作成しようとしたDisplayTemplatesと呼ばれる、フォルダをNullableDateTime.cshtml:と内@using MyHelpers @model System.DateTime? @Model.MyCustomExtension()。ここMyCustomExtensionでの拡張メソッドですDateTime?。ただし、DateTimeの場合は例外が発生しますか?フィールドは本当にnullで、辞書にはDateTimenullではないタイプのモデル要素が必要であることを教えてくれます。null可能なDateTimeのDisplayTemplateを定義する方法はありますか?
スラウマ

@Slauma:うーん、いい質問ですね。私はおそらくに固執し、NullableDateTime.cshtml@ NickLarsenが提案して使用するアプローチを使用します@Html.DisplayFor(m => m.MyDateTime, "NullableDateTime")
ataddeini、

DateTime.cshtmlテンプレートが「@model DateTime?」として設定されている場合は、テンプレートの名前を明示的に追加する必要はありません。「DateTime」の代わりに。そうすれば、すべての日付(null可能かどうかにかかわらず)が同じテンプレートで処理されます...
ロミア

7

私の好みは、ビューモデルではなくビューのフォーマットの詳細を保持することです。MVC4 / Razorでは:

@Html.TextBoxFor(model => model.DateTime, "{0:d}");

日時形式のリファレンス:http ://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

それから私はそれにバインドされたjQuery日付ピッカーを持っています、そしてそれは別の形式で日付を入れています...

日付ピッカーのフォーマットを同じフォーマットに設定する必要があるようです。

だから私はSystem.Globalizationdata- *属性にフォーマットを保存し、設定時にそれを収集しています

@Html.TextBoxFor(
    model => model.DateTime.Date, 
    "{0:d}", 
    new 
    { 
        @class = "datePicker", 
        @data_date_format=System.Globalization.CultureInfo
                          .CurrentUICulture.DateTimeFormat.ShortDatePattern 
    }));

そして、これは厄介な部分です:.netとdatepickerの形式が一致しないため、ハッカーが必要です。

$('.datePicker').each(function(){
    $(this).datepicker({
        dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
    });
});

それはちょっと弱いですが、多くのケースをカバーするはずです。


最初の3行は最も重要です:)例とフォーマット定義へのリンク
Borik

2

私のために働く

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>

この質問は明らかにかみそりビューエンジンを使用しています。別の言語を使用して返信しました。
Rhys Bevilaqua 2014年

2

最近同じ問題がありました。

モデルでDataType日付として定義するだけでも機能することを発見しました(コードファーストアプローチを使用)

[DataType(DataType.Date)]
public DateTime Added { get; set; }


0

日付を短い形式で表示したい場合は、@ Model.date.ToShortDateString()を使用して日付を出力します


0

日付を特定の形式で表示するだけの場合は、次のように呼び出します。

@Model.LeadDate.ToString("dd-MMM-yyyy")

@Model.LeadDate.ToString("MM/dd/yy")

次の形式になります。

26-Apr-2013

04/26/13

@ Model.LeadDate == nullの場合はどうなりますか?
Bimal Das

0

これはdd/MM/yyyyビューにフォーマットで表示されます

ビューで:

DisplayForこのコードを使用する代わりに

<td>

@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")

</td

また、日付列の値がnullかどうかもチェックします。trueの場合、日付が空であるか、列の実際のフォーマットされた日付が表示されます。

希望は誰かを助けます。


0
@{
  string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");        
  @datein
}


-2

このようにファイル調整のみを表示します。これを試してみてください。

@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), 
                            "{0: yyyy-MM-dd}")

item.transdateそれはあなたのあるDateTime型のデータ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.