web-dev-qa-db-ja.com

MVCモデルのTimeSpanフィールドのフォーマット

いくつかのタイムピッカーを含む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; }

    ...
}

いつものように感謝します!

18
SamiHuutoniemi
[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)
31