いくつかのタイムピッカーを含む MVC ページがあります。これらは、モデル内のオブジェクトのリストに null 可能 として保存されます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; }
...
}
いつも感謝してます!
ベストアンサー1
[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 時間より長くなる可能性があります。また、タイムラインを逆方向に進んでいることを表すために、負の値になることもあります。
その許容できるは、それらを時刻として使用し、実際にはフレームワーク自体によって実行されます (例: DateTime.TimeOfDay
)。ただし、このように使用する場合は、ユーザー入力を慎重に検証する必要があります。データ型だけに頼ると、ユーザーは有効な時間範囲の値を入力できる可能性がありますが、有効な日付時刻は入力できない可能性があります。たとえば、 は、1 日 22 時間 33 分 44 秒を表す-1.22:33:44
有効な値です。TimeSpan
過去に。
.Net にネイティブ型があればずっと簡単になりますがTime
、
そうではありません
。アップデート:パッケージにネイティブTimeOfDay
タイプが追加されました。System.Time
コアFXラボ。
また、このTextBoxFor
メソッドはデータ注釈を取得しません。次のように、フォーマット文字列をパラメータとして直接指定することもできます。
@Html.TextBoxFor(x => x.Shifts[i].Start, "{0:hh\\:mm}")
または、次のように切り替えることもできますEditorFor
。
@Html.EditorFor(x => x.Shifts[i].Start)