我有以下DateTime类型的扩展方法
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转换为DateTime,以便在同一行中应用扩展方法?
我试过了:
@(DateTime)ViewBag.PrioritySummary.UpdateDttm.ToCST();
但这没有用。
答案 0 :(得分:2)
您应该将表达式括在括号中:
@(((DateTime)ViewBag.PrioritySummary.UpdateDttm).ToCST());
并在视图的开头添加相应的using
语句。
@using ...DateTimeHelper;
答案 1 :(得分:2)
错误的根本原因是您无法在动态表达式上使用扩展方法,因为它们在编译时被绑定。由于ViewBag
是动态的,因此整个表达式在运行时绑定。当您转换为DateTime
时,编译器可以绑定到静态方法。
没有强制转换的另一个选择是直接调用静态方法:
@DateTimeHelper.ToCST(ViewBag.PrioritySummary.UpdateDttm);
由于您使用dynamic
,因此两种情况都不是完全类型保存。您将获得无效的强制转换异常或运行时绑定异常。
答案 2 :(得分:0)
尝试这样的事情:
@((DateTime)(ViewBag.PrioritySummary)).UpdateDttm.ToCST();
答案 3 :(得分:0)
非常感谢您的回答, 在我尝试你的选择后,我意识到这是一个'()'问题, 以下行对我来说很好。
@(((DateTime)(ViewBag.PrioritySummary).UpdateDttm).ToCST());
感谢。