【问题标题】:ASP.NET MVC: ActionFilterAttribute not setting ViewDataASP.NET MVC:ActionFilterAttribute 未设置 ViewData
【发布时间】:2010-12-29 18:26:02
【问题描述】:

我写了下面的 ActionFilterAttribute

Imports System.Web.Mvc

Namespace Mvc.Filters
    Public Class StopWatchFilter : Inherits ActionFilterAttribute
        Private tStart As DateTime
        Private tStop As DateTime

        Public Overrides Sub OnActionExecuting( _
            ByVal filterContext As ActionExecutingContext)

            tStart = DateTime.Now

        End Sub

        Public Overrides Sub OnResultExecuted( _
            ByVal filterContext As ResultExecutedContext)

            tStop = DateTime.Now
            filterContext.Controller.ViewData("StopWatch") = _
                ((tStop - tStart).TotalMilliseconds / 1000).ToString(".00")
        End Sub
    End Class
End Namespace

我设置在我的控制器上

''# Fixes SO code coloring
<MyApp.StopWatch()>
Function Index() As ActionResult
    Return View()
End Function

但是当我尝试在我的视图中显示 ViewData("StopWatch") 时,它只是空白。

我在这里错过了一些愚蠢的东西吗?

编辑:

似乎我可以在OnActinExecuting 中设置ViewData,但在OnResultExecuted不能

那么,我到底如何才能制作秒表ActionFilter

【问题讨论】:

  • 你想做什么?将请求的总执行时间写入响应?如果是这样,那么您就处于 catch-22 状态,因为在请求完成处理之前您不会知道执行时间,但在那个时候,响应已经被确定/写入。如果您密切关注 MVC(视图中的逻辑很少甚至没有逻辑),那么对操作进行计时将使您非常接近您正在寻找的内容。

标签: asp.net-mvc vb.net viewdata actionfilterattribute


【解决方案1】:

好的,知道了。

OnActionExecuted 允许我仍然将结果写入视图,因为结果尚未执行(OnResultExecuted 已经将结果执行到视图)!

Imports System.Web.Mvc

Namespace Mvc.Filters
    Public Class StopWatchFilter : Inherits ActionFilterAttribute
        Private tStart As DateTime
        Private tStop As DateTime

        Public Overrides Sub OnActionExecuting(ByVal filterContext As ActionExecutingContext)
            tStart = DateTime.Now
        End Sub

        Public Overrides Sub OnActionExecuted(ByVal filterContext As ActionExecutedContext)
            tStop = DateTime.Now
            filterContext.Controller.ViewData("StopWatch") = ((tStop - tStart).TotalMilliseconds / 1000).ToString(".00")
        End Sub
    End Class
End Namespace

基本上,如果您将上述属性附加到任何操作,并在您的视图中使用ViewData("StopWatch")。您可以看到 Controller Action 执行所用的时间。

【讨论】:

  • “更好”是什么意思?它们只是不同的事件,因此只是通过 MVC 执行管道的不同挂钩。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多