20

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

    ...
}

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

4

1 に答える 1

35
[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

Time.Net にネイティブ型があれば非常に簡単ですが、そうではありません更新: CoreFXLabで利用可能なパッケージにネイティブTimeOfDayタイプが追加されました。System.Time

また、TextBoxForメソッドはデータ注釈を取得しません。次のように、フォーマット文字列をパラメーターとして直接指定することもできます。

@Html.TextBoxFor(x => x.Shifts[i].Start, "{0:hh\\:mm}")

EditorForまたは、次のように切り替えることができます。

@Html.EditorFor(x => x.Shifts[i].Start)
于 2013-07-14T04:31:02.693 に答える