2017-11-23 23 views
1

私はgetアクションが送信されdiferent形式でのDateTimeパラメータを読み込むしようとしている問題を持っているこの時点で問題ASP.NETカスタムモデル:日時

日時が送信されますが、この形式になっています。0:dd/MM/yyyy ゲットアクションが期待する:0:MM/dd/yyyy

溶液(多分)

をGETアクションは、私は期待しているものを変更するにはカスタムモデルバインディングを使用します。

GETアクション

public async Task<IActionResult> Details(int? id, [ModelBinder(typeof(PModelBinder))]DateTime date) 

ModelBinderクラス

が今ここに欠けているいくつかのことであり、私はそれを正しく完了させる方法がわからない:

public class PModelBinder : IModelBinder 
{ 
    public Task BindModelAsync(ModelBindingContext bindingContext) 
    { 
     string theDate = bindingContext.HttpContext.Request.QueryString["date"]; 
     //What should I write inside the []? 
     //I've tried QueryString["date"] which is the name of the parameter but it says is wrong 
     DateTime dt = new DateTime(); 
     bool success = DateTime.TryParse(date); //Should I apply ParseExact? How should I do it? 
     if (success) 
     { 
      return new //what should I be returning here? dt? 
     } 

    } 
} 

私はちょうど始まるので、上記のコードでコメントとしてマークされたいくつかの質問がありますカスタムモデルバインディングを理解する。誰も私にいくつかのアドバイスを与えることができると思う。

私はこの記事を以下のよ:

https://weblogs.asp.net/melvynharbour/mvc-modelbinder-and-localization

しかし、それは2008からです!、それはまさに私がGETアクション(diferent日付形式)を抱えている問題だから、それは有効なようですが

更新:aditional情報

パラメータ日付が次のように定義されます

date=10%2F11%2F2017%200%3A00%3A00 
0123:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime FechaLInicioLiq { get; set; } 
とそのアクションをGET呼び出すURLのビルドは、日付パラメータのこのような構造を持っています
+0

アルベルトあなたがDateTimeのに必要な "0:MM/DD/YYYY" を "0:DD/MM/YYYY" .Am私は正しい... –

+0

@VIGNESHARUNACHALAM datetimeは0:dd/MM/yyyyの形式で送信されますが、GETアクションはその形式が0:MM/dd/yyyyのようにパラメータを読み取ろうとしているため、エラーが発生します。だから、GETアクションが0:dd/MM/yyyy形式を受け入れ始める必要があります。 –

+0

MVCのどのバージョンですか? –

答えて

3

は、あなたのモデルバインダーの実装でいくつかの問題があります。

  1. は、パラメータ名(date)をハードコーディングしないでください。代わりにbindingContext.ModelNameを使用してください。
  2. 実際に値が提供されなかった場合は、状況を処理する必要があります。 IValueProvider.GetValue()の結果をValueProviderResult.Noneと比較して確認できます。ここで

はあなたが必要なものを達成サンプルのDateTimeモデルバインダーである:

public class DateTimeModelBinder : IModelBinder 
{ 
    private readonly IModelBinder baseBinder = new SimpleTypeModelBinder(typeof(DateTime)); 

    public Task BindModelAsync(ModelBindingContext bindingContext) 
    { 
     var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (valueProviderResult != ValueProviderResult.None) 
     { 
      bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult); 

      var valueAsString = valueProviderResult.FirstValue; 

      // valueAsString will have a string value of your date, e.g. '31/12/2017' 
      var dateTime = DateTime.ParseExact(valueAsString, "dd/MM/yyyy", CultureInfo.InvariantCulture); 
      bindingContext.Result = ModelBindingResult.Success(dateTime); 

      return Task.CompletedTask; 
     } 

     return baseBinder.BindModelAsync(bindingContext); 
    } 
} 
+0

返信いただきありがとうございます。私はそれを実装しようとしているが、私はこの行の結果を主張するエラーをgettintです:bindingContext.ModelState.SetModelValue(bindingContext.ModelName、valueProvideResult);一度ParseExact関数に渡されると、その文字列は有効なDateTimeとして認識されませんでした。私は値を見るためにその行でそれをデバッグしようとしていますが、私はそれを見ることができる前にその行をスキップし、エラーをスローします。 –

+0

質問の最後に余分な情報を追加しています。 –

+0

SetModelValueにはどのようなエラーがありますか? – CodeFuller