2017-08-02 19 views
1

私は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バインダーがすでにそれをやろうとしていたので、何もするのが遅すぎると思います。

+0

これは本当に対処するのが難しいですか? – user1161137

答えて

0

私は、MVC ModelBinderはTimeSpanを扱うのが好きではありませんでしたか?それは常にINVALIDのモデル状態を返すだけです。それで、私はmvcモデルのバインダーにそのフィールドをバインドするSKIPに伝える方法がわからないので、モデルバインダーをそのフィールドにバインドさせないというアプローチに行きました。

私はViewModelに追加のSTRINGプロパティを追加し、そのプロパティをVIEWに使用させました。次に、以下のCUSTOM MODEL Binderを使用して(これに似ていますが、少し前のものに変更)、STRINGの時間値をREAL TimeSpanに移動しますか?私のモデルのプロパティ。

ので:オリジナルのTimeSpanをサポートする

CUSTOM BINDER

public class TimeModelBinder : DefaultModelBinder 
     { 
      public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
      {  
       var model = (ReceiptClassifyDetailViewModel)base.BindModel(controllerContext, bindingContext); 
       var the12HrTime = controllerContext.HttpContext.Request["TempTimeOnVM"]; 

       if (!string.IsNullOrEmpty(the12HrTime)) 
       { 
        DateTime t = DateTime.ParseExact(the12HrTime, "h:mm tt", CultureInfo.InvariantCulture); 
        TimeSpan? ts = t.TimeOfDay; 
        model.TheTime = ts; 
       } 

       return model; 
      } 
     } 

VIEW

 <div class="form-group"> 
      @Html.Label("The Time", new { @class = "col-xs-6 col-sm-6 col-md-4 col-lg-4 control-label col-form-label text-right" }) 
      <div class="col-xs-6 col-xs-6 col-sm-6 col-md-8 col-lg-8"> 
       @Html.TextBoxFor(x => x.TempTimeOnVM, new {@class = "form-control timemask form-control-sm", dataUserDefined = "true", placeholder = "Time"}) 
       @Html.ValidationMessageFor(x => x.TempTimeOnVM, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

追加のプロパティ?プロパティ。

public string TempTimeOnVM { get; set; } 
関連する問題