2016-10-28 8 views
0

に拡張メソッドを使用して、I持ってのDateTime型のため、次の拡張メソッドはViewbag

public static class DateTimeHelper 
{ 
    public static DateTime ToCST(this DateTime dt) 
    { 
     TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
     DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(dt, cstZone); 

     return cstTime; 
    } 
} 

これはDateTimeオブジェクトを持つコントローラで正常に動作しますが、ビューに、私はちょうど、ViewBagでこれを使用したいですこのように:

@ViewBag.PrioritySummary.UpdateDttm.ToCST(); 

私は次のエラーを取得する:

 
'System.DateTime' does not contain a definition for 'ToCST' 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.DateTime' does not contain a definition for 'ToCST' 

Source Error: 

Line 8:  DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(ViewBag.PrioritySummary.UpdateDttm, cstZone); 
Line 9: } 
Line 10: @ViewBag.PrioritySummary.UpdateDttm.ToCST(); 

私はダにViewBagを唱えられる方法teTime、拡張メソッドを同じ行に適用するには?

私が試した:

@(DateTime)ViewBag.PrioritySummary.UpdateDttm.ToCST(); 

をしかし、これは動作しませんでした。

@(((DateTime)ViewBag.PrioritySummary.UpdateDttm).ToCST()); 

をし、あなたのビューの先頭に対応するusingステートメントを追加する:

+2

'.ToCST()'メソッドがある名前空間を含めるために@using文を追加しましたか? – JLRishe

+0

@JLRisheええ、私は、例えば、剃刀のブロックでそれを使うことができます。しかし、私はそれをインラインでしたいと思います。 –

答えて

2

あなたは括弧であなたの表現をラップする必要があります。

@using ...DateTimeHelper; 
+0

こんにちは、ありがとう、 '@'は、剃刀のラインをキャストし、それを遵守したときにのみこれを解釈します:** @((DateTime)ViewBag.PrioritySummary.UpdateDttm)** ToCST();かみそりのコードとして。出力は次のようなものです:10/01/2016 2:51:10 PM.ToCST(); –

+0

もう1組のかっこが必要だと思います。 '@(((DateTime)ViewBag.PrioritySummary.UpdateDttm).ToCST())' – Tonkleton

+0

@MiguelRodrigoAlbarracin paranthesesの問題は解決しました。しかし、私はあなたが別の障害を見つけると思う、見てみてくださいここhttps://dotnetfiddle.net/hEYm9V。 – Christos

0

このような何か試してみてください:

@((DateTime)(ViewBag.PrioritySummary)).UpdateDttm.ToCST(); 
0

こんにちはすべてを次の行には、のために正常に動作しますあなたの答えのおかげで、 私はあなたのオプションを試した後、私は「()」の問題で実現し、 私。

@(((DateTime)(ViewBag.PrioritySummary).UpdateDttm).ToCST()); 

ありがとうございます。

2

エラーの根本原因は、コンパイル時にバインドされているため、ダイナミック式で拡張メソッドを使用できないことです。 ViewBagは動的なので、式全体が実行時にバインドされます。 DateTimeにキャストすると、コンパイラは静的メソッドにバインドできます。キャストなし

別のオプションは、直接静的メソッドを呼び出すことです:

@DateTimeHelper.ToCST(ViewBag.PrioritySummary.UpdateDttm); 

どちらの場合は、完全に入力し、保存あなたはdynamicを使用しているので、あります。無効なキャスト例外または実行時バインディング例外が発生します。

関連する問題