いくつかのタイムピッカーを含むMVCページがあります。これらは、nullable TimeSpan
としてモデル内のオブジェクトのリストに格納されます。問題は、タイムフィールドを秒単位で入力フィールドに出力することです。これらのモデルプロパティをフォーマットして、タイムスパンを他の方法で印刷できるようにする方法はありますか(7:00
ではなく07:00:00
など)。言うまでもなく、[DisplayFormat...]
に対する私の「提案」は機能しませんでした。少なくとも私が望んだ方法ではありません。
入力フィールドは次のように定義されています。
@Html.TextBoxFor(x => x.Shifts[i].Start)
モデルの関連部分は次のようになります。
public class Workshift
{
[DisplayFormat(Something here perhaps?)]
public TimeSpan? Start { get; set; }
public TimeSpan? End { get; set; }
public TimeSpan? Pause { get; set; }
}
public class TimeRegistrationViewModel
{
public List<Workshift> Shifts { get; set; }
...
}
いつものように感謝します!
[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)]
public TimeSpan? Start { get; set; }
[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)]
public TimeSpan? End { get; set; }
[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)]
public TimeSpan? Pause { get; set; }
ただし、TimeSpan
の主な目的は、時間ではなく測定された期間を表すことであることに注意してください。つまり、TimeSpan
の値は24時間より長くなる可能性があります。タイムラインを逆方向に移動することを表すために、負の値にすることもできます。
それらを時刻として使用するのはacceptableであり、実際にはフレームワーク自体によって行われます(たとえば、DateTime.TimeOfDay
)。ただし、この方法で使用する場合は、ユーザー入力を慎重に検証する必要があります。データタイプだけに依存している場合、ユーザーは有効な期間であるが有効な日ではない値を入力できる可能性があります。たとえば、-1.22:33:44
は、過去1日、22時間、33分、44秒を表す有効なTimeSpan
です。
.NetがネイティブのTime
型を持っていると、はるかに簡単になります。 しかしそれはしません。 更新:ネイティブのTimeOfDay
タイプがSystem.Time
パッケージにあります CoreFXLab 。
また、TextBoxFor
メソッドはデータ注釈を取得しません。次のように、フォーマット文字列をパラメータとして直接指定することもできます。
@Html.TextBoxFor(x => x.Shifts[i].Start, "{0:hh\\:mm}")
または、次のようにEditorFor
に切り替えることができます。
@Html.EditorFor(x => x.Shifts[i].Start)