私はTimeSpanを持っていますか?私のモデルのプロパティと私は、 'hh:mm a'の形式でブートストラップdatetimepicker経由で12時間の値を取得しようとしているビューがあります。MVCモデルバインディングが12時間稼働しない時間帯
ビューで12時間を割り当てると、私のモデルは値を拒否し続け、プロパティに割り当てられた値が常にnullであることがわかります。 (これは24時間使用していてもうまく動作します)。また、私が時間を入力せず、プロンプトを空のままにしておくと、ビューのポストが機能します。
はここに私のビュー
<div class="form-group">
@Html.Label("Time", new { @class = "control-label col-form-label text-right" })
<div class="">
@Html.TextBoxFor(x => x.TheTime, new {@class = "form-control form-control-sm", dataUserDefined = "true", placeholder = "Time"})
@Html.ValidationMessageFor(x => x.TheTime, "", new { @class = "text-danger" })
</div>
</div>
モデルにおける時間であるだけで
[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$", ErrorMessage = "Invalid Time.")]
public TimeSpan? TheTime {get; set;}
今REG式が、それはビューのことだ、と入力していただきましたが、12時間形式であることを検証しません。検証が合格していないようです。無効な時間メッセージが表示されないためです。ポストバックは、ModelBinder.IsValidがfalseであることを示しています。
私はauto-propertyを分解してバッキングフィールドを持つようにして、セットに入る 'value'を調べました。私はセットで値が常にnullであることを確認します。だから、mvcモデルのバインダーは、12時間のフォーマットで時間をどうするべきか分かりません。
アイデア?どうもありがとう。
12時間フォーマットのtimespanバインディングにカスタムモデルバインダーが必要ですか?
[UPDATE]: 私はカスタムモデルバインダーを試しました。しかし、同じ問題が存在する!
私はControllerContext.HttpContext.Request ["TheTime"]をチェックすると正しい値が入力されるのを見ています。
私は(TheVModelが私のviewmodelであることに注意)を使用して、タイムスパンに変換:
カスタムモデルバインダー
public class TimeModelBinder : DefaultModelBinder {
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
var model = (TheVModel)base.BindModel(controllerContext, bindingContext);
var the12HrTime = controllerContext.HttpContext.Request["TheTime"];
DateTime t = DateTime.ParseExact(the12HrTime, "h:mm tt", CultureInfo.InvariantCulture);
TimeSpan? ts = t.TimeOfDay;
model.TheTime = ts;
return model;
}
}
私はHttpContext.Request [ "TheTime"]は持っていることがわかります12時間。
timespan tsが正しく作成され、TheTimeがプロパティに正しく設定されているのが分かります...しかし、私はMvcバインダーがすでにそれをやろうとしていたので、何もするのが遅すぎると思います。
これは本当に対処するのが難しいですか? – user1161137