【问题标题】:Use an extension method in a Viewbag在 Viewbag 中使用扩展方法
【发布时间】:2016-10-28 16:42:32
【问题描述】:

我有以下 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”不包含“ToCST”的定义 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“System.DateTime”不包含“ToCST”的定义 源错误: 第 8 行:日期时间 cstTime = TimeZoneInfo.ConvertTimeFromUtc(ViewBag.PrioritySummary.UpdateDttm, cstZone); 第 9 行:} 第 10 行:@ViewBag.PrioritySummary.UpdateDttm.ToCST();

如何将 ViewBag 转换为 DateTime,以便在同一行中应用扩展方法?

我试过了:

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

但这没有用。

【问题讨论】:

  • 您是否添加了@using 语句以包含.ToCST() 方法所在的命名空间?
  • @JLRishe 是的,例如,我可以在一块剃须刀中使用它。但我想在线完成

标签: c# asp.net-mvc datetime viewbag


【解决方案1】:

你应该把你的表达式用括号括起来:

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

并在视图开头添加相应的using 语句。

@using ...DateTimeHelper;

【讨论】:

  • 嗨,谢谢,'@' 投了一条剃刀线,当它遵守时,它只解释这个:@((DateTime)ViewBag.PrioritySummary.UpdateDttm).ToCST() ;作为剃刀代码。所以输出类似于:10/01/2016 2:51:10 PM.ToCST();
  • 我认为还需要一组括号:@(((DateTime)ViewBag.PrioritySummary.UpdateDttm).ToCST())
  • @MiguelRodrigoAlbarracin 括号的问题已经解决,请看我的更新。不过,我想你会发现另一个障碍,请看这里dotnetfiddle.net/hEYm9V
【解决方案2】:

错误的根本原因是您不能对动态表达式使用扩展方法,因为它们是在编译时绑定的。由于ViewBag 是动态的,因此整个表达式在运行时被绑定。当您强制转换为DateTime 时,编译器可以绑定到静态方法。

另一个没有强制转换的选项是直接调用静态方法:

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

由于您使用的是dynamic,这两种情况都不是完全类型保存的。您将获得无效的强制转换异常或运行时绑定异常。

【讨论】:

    【解决方案3】:

    试试这样的:

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

    【讨论】:

      【解决方案4】:

      大家好,感谢您的回答, 在尝试了您的选择后,我意识到这是一个“()”问题, 以下行对我来说很好。

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

      谢谢。

      【讨论】:

        猜你喜欢
        • 2015-03-12
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多