2016-10-28 1 views
0

I Verwenden Sie haben die folgende Erweiterungsmethode für Datetime-Typeine Erweiterungsmethode in einem 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; 
    } 
} 

das funktioniert in der Steuerung mit Datetime-Objekte in Ordnung, aber in der Ansicht möchte ich dies in einem ViewBag bedienen, einfach wie folgt aus:

@ViewBag.PrioritySummary.UpdateDttm.ToCST(); 

ich erhalte die folgende Fehlermeldung:

 
'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(); 

Wie ich ein ViewBag nach Da werfen könnte teTime, um die Erweiterungsmethode in derselben Zeile anzuwenden?

Ich habe versucht:

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

Aber das hat nicht funktioniert.

+2

Haben Sie eine @ using-Anweisung hinzugefügt, um den Namespace einzubeziehen, in dem sich die '.ToCST()' -Methode befindet? – JLRishe

+0

@JLRishe Ja, ich kann es zum Beispiel in einem Rasierklingenblock verwenden. aber ich möchte es in-line tun –

Antwort

2

Sie sollten Ihren Ausdruck in Klammern wickeln:

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

und die entsprechende using Anweisung am Anfang Ihrer Ansicht hinzuzufügen.

@using ...DateTimeHelper; 
+0

Hallo danke, das '@' warf eine Rasierklinge und wenn es eingehalten wurde, interpretieren Sie dies nur: ** @ ((DateTime) ViewBag.PrioritySummary.UpdateDttm) **. ToCST(); als Rasierkode. Die Ausgabe ist also ungefähr wie folgt: 10/01/2016 2:51:10 PM.ToCST(); –

+0

Ich denke, ein weiterer Satz Klammern wird benötigt: '@ (((DateTime) ViewBag.PrioritySummary.UpdateDttm) .ToCST())' – Tonkleton

+0

@MiguelRodrigoAlbarracin Das Problem mit den Klammern wurde gelöst, siehe mein Update. Ich denke jedoch, dass Sie ein weiteres Hindernis finden werden, bitte schauen Sie hier https://dotnetfiddle.net/hEym9V. – Christos

0

so etwas wie dieses Versuchen:

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

Hallo alle Dank für Ihre Antworten, nachdem ich Ihre Möglichkeiten versuchen, erkannte ich, dass ein ‚()‘ Problem, die folgende Zeile für die Feinarbeiten mich.

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

Danke.

2

Die Ursache des Fehlers besteht darin, dass Sie keine Erweiterungsmethoden für dynamische Ausdrücke verwenden können, da sie zur Kompilierungszeit gebunden sind. Da ViewBag dynamisch ist, ist der gesamte Ausdruck zur Laufzeit gebunden. Wenn Sie in DateTime umwandeln, kann der Compiler dann an die statische Methode binden.

Eine weitere Option ohne den Darstellern ist die statische Methode direkt aufzurufen:

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

Weder Fall ist, da Sie dynamic verwenden vollständig typ speichern. Sie erhalten entweder eine ungültige Cast-Ausnahme oder eine Laufzeitbindungsausnahme.