モデルクラスに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
パラメーターを使用できないと思います。
特定の形式で日付を表示するだけであれば、次のように呼び出します。
@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")
[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())
モデル内の単純なフォーマットされた出力
@String.Format("{0:d}", model.CreatedOn)
またはforeachループ内
@String.Format("{0:d}", item.CreatedOn)
次のアプローチを使用して、インライン形式でモデルの日付プロパティを表示します。
@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")
そうでない場合は、TextBoxまたはEditorにデータを入力するときに、@ Darinが提案したように、属性を[DisplayFormat]
属性で装飾することができます。
すべてのDateTime
型が同じ方法でレンダリングされる場合、カスタムDateTime
表示テンプレートを使用できます。
Viewsフォルダーで、コントローラー固有のビューフォルダーまたは「Shared」フォルダーの下に「DisplayTemplates」という名前のフォルダーを作成します(これらはパーシャルに似ています)。
内部でDateTime.cshtml
という名前のファイルを作成し、DateTime
を@model
として使用し、日付のレンダリング方法をコーディングします。
@model System.DateTime
@Model.ToLongDateString()
ビューでこれを使用するだけで、動作するはずです:
@Html.DisplayFor(mod => mod.MyDateTime)
「DisplayTemplates」フォルダーに追加し、表示しているタイプに合わせてファイルに名前を付けるという規則に従う限り、MVCは自動的にそれを使用して値を表示します。これは、「EditorTemplates」を使用した編集シナリオでも機能します。
私の好みは、ビューモデルではなくビューでフォーマットの詳細を保持することです。 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")
});
});
それはちょっと弱いですが、多くの場合をカバーする必要があります。
私のために働く
<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
最近同じ問題がありました。
モデルでDataTypeをDateとして定義するだけでも同様に機能することを発見しました(Code Firstアプローチを使用)
[DataType(DataType.Date)]
public DateTime Added { get; set; }
このようにすることができます@item.Date.Value.Tostring("dd-MMM-yy");
特定の形式で日付を表示するだけの場合は、単に呼び出します:
@Model.LeadDate.ToString("dd-MMM-yyyy")
@Model.LeadDate.ToString("MM/dd/yy")
次の形式になります
26-Apr-2013
04/26/13
日付を短い形式で表示したい場合は、@ Model.date.ToShortDateString()を使用するだけで、日付が
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
@{
string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");
@datein
}
これはビューにdd/MM/yyyy
形式で表示されます
表示中:
DisplayFor
の代わりにこのコードを使用します
<td>
@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")
</td
また、日付列の値がnullであるかどうかをチェックし、trueの場合、日付が空であるか、列の実際の書式設定された日付を表示します。
希望は誰かを助ける。