2017-11-22 3 views
0

問題は:ルーティング:ヌルとして日時パラメータを渡す/空

2つの属性は、コントローラのために必要とされます。ただし、そのうちの1つ(datetime)はnullになります。

コントローラーが2つの属性が受け取ることができるように

新しいルーティングが組み込まれたルーティング:

app.UseMvc(routes => 
    { 
     routes.MapRoute(
      "RequestHistorial", 
      "HechosLiquidadors/Details/{id:int}/{date:datetime}", 
      defaults: new { controller = "HechosLiquidadors", action = "Details" }); 
     routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 

datetimeパラメータは、フォーマット制限か何かを持っていません。

データが

送信される方法このパラメータを送信する図である。

<table class="table table-bordered table-hover table-striped" id="LiquidacionesList"> 
<thead> 
    <tr> 
     {...} 
     <th>Resultados</th> 
    </tr> 
</thead> 
<tbody> 
    @foreach (var item in Model) 
    { 
     <tr> 
      {...} 
      <td> 
       <div class="btn-group"> 
        <a asp-action="Details" asp-route-id="@item.StoreID" 
        asp-route-date="@item.FechaLFinLiq" 
        class="btn btn-default">Consultar</a> 
       </div> 
      </td> 
     </tr> 

このテーブルモデルの各要素スルーれる反復のforeachで構成されボタンは必要な属性を受け取り、送信されたasp-route-id/dateを使用します。注:テーブルはうまく構築されています。すべての目的のデータが表示されます。私は日付がために起こっていると仮定しdate=21%2F11%2F2017%200%3A00%3A00:この部分については

http://localhost:60288/HechosLiquidadors/Details/13?date=21%2F11%2F2017%200%3A00%3A00

ボタンは、これをクリックすると、結果

が示されているWebアドレスですコントローラ。しかし、ときに私はこれを実行します。

public async Task<IActionResult> Details(int? id, DateTime date) 
{ 
    return Content(id + "/" + date); 
} 

結果は次のとおりです。私はコントローラに渡している日付の書式設定に問題があると考えてい11/01/01/0001 0:00:00

?私は運がない答えを探していました。前もって感謝します!

UPDATE

問題は、Getメソッドは、この日付にする方法であるように思えます。 Getメソッドは、それが与えられた別のフォーマットを期待しているので、日付をnullとして宣言しているようです。

更新を継続します。

答えて

0

GETリクエストとASP.NET Core 2の日付で同じ問題が発生しました.GETリクエストとPOSTリクエストの両方でサーバーのデフォルトの日付形式を使用するように、アプリケーション全体の既定の動作をオーバーライドする場合は、下記を参照してください。 TryParseExactなどを使用して日付を解析することで改善の余地があり、null可能な日付時刻をカバーしていないことに注意してください。

このコードは重くスタートアップクラスに続いてhttps://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding

public class DateTimeModelBinder : IModelBinder 
{ 
    public Task BindModelAsync(ModelBindingContext bindingContext) 
    { 
     if (bindingContext == null) 
     { 
      throw new ArgumentNullException(nameof(bindingContext)); 
     } 

     // Specify a default argument name if none is set by ModelBinderAttribute 
     var modelName = bindingContext.BinderModelName; 
     if (string.IsNullOrEmpty(modelName)) 
     { 
      modelName = bindingContext.ModelName; 
     } 

     // Try to fetch the value of the argument by name 
     var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName); 

     if (valueProviderResult == ValueProviderResult.None) 
     { 
      return Task.CompletedTask; 
     } 

     bindingContext.ModelState.SetModelValue(modelName, valueProviderResult); 

     var value = valueProviderResult.FirstValue; 

     // Check if the argument value is null or empty 
     if (string.IsNullOrEmpty(value)) 
     { 
      logger.Debug($"{modelName} was empty or null"); 
      return Task.CompletedTask; 
     } 

     if (!DateTime.TryParse(value, out DateTime date)) 
     { 
      bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, "Invalid date or format."); 
      return Task.CompletedTask; 
     } 

     bindingContext.Result = ModelBindingResult.Success(date); 
     return Task.CompletedTask; 
    } 
} 

public class DateTimeModelBinderProvider : IModelBinderProvider 
{ 
    private readonly IModelBinder binder = new DateTimeModelBinder(); 

    public IModelBinder GetBinder(ModelBinderProviderContext context) 
    { 
     //Could possibly inspect the context and apply to GETs only if needed? 
     return context.Metadata.ModelType == typeof(DateTime) ? binder : null; 
    } 
} 

に基づいています> ConfigureServices方法

services.AddMvc(options => 
    { 
     //Forces Dates to parse via server format, inserts in the binding pipeline as first but you can adjust it as needed 
     options.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider()); 
    }); 
関連する問題