web-dev-qa-db-ja.com

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

モデルクラスに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パラメーターを使用できないと思います。

116
Slauma

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

@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")
159
Nick Larsen

[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())
171
Darin Dimitrov

モデル内の単純なフォーマットされた出力

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

またはforeachループ内

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

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

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

そうでない場合は、TextBoxまたはEditorにデータを入力するときに、@ Darinが提案したように、属性を[DisplayFormat]属性で装飾することができます。

23
Steven

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

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

内部でDateTime.cshtmlという名前のファイルを作成し、DateTime@modelとして使用し、日付のレンダリング方法をコーディングします。

@model System.DateTime
@Model.ToLongDateString()

ビューでこれを使用するだけで、動作するはずです:

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

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

テンプレートの詳細はこちら

9
ataddeini

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

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

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

それから私はそれにバインドされたJQueryのdatepickerを持っています、そしてそれは別の形式として日付を入れます... doh!

Datepickerの形式を同じ形式に設定する必要があるようです。

したがって、System.Globalizationフォーマットをdata- *属性に保存し、セットアップ時にそれを収集しています。

@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")
    });
});

それはちょっと弱いですが、多くの場合をカバーする必要があります。

7
philn5d

私のために働く

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

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

モデルでDataTypeDateとして定義するだけでも同様に機能することを発見しました(Code Firstアプローチを使用)

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

このようにすることができます@item.Date.Value.Tostring("dd-MMM-yy");

1
Saurabh Solanki

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

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

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

次の形式になります

26-Apr-2013

04/26/13
0
Kailas Mane

日付を短い形式で表示したい場合は、@ Model.date.ToShortDateString()を使用するだけで、日付が

0
Marcianin

MVC5では、モデルが日時の場合に使用します

string dt = Model.ToString("dd/MM/yyy"); 

または、モデルに日時のプロパティが含まれている場合

string dt = Model.dateinModel.ToString("dd/MM/yyy"); 

Formatsの正式な意味は次のとおりです。

https://msdn.Microsoft.com/en-us/library/8kb3ddd4(v = vs.110).aspx

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

これはビューにdd/MM/yyyy形式で表示されます

表示中:

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

<td>

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

</td

また、日付列の値がnullであるかどうかをチェックし、trueの場合、日付が空であるか、列の実際の書式設定された日付を表示します。

希望は誰かを助ける。

0
stom