asp.net-mvconactionexecuting

OnActionExecuting fires multiple times


I'm not sure if this is the correct way to go about the problem I need to solve... however in an OnActionExecuting action filter that I have created, I set a cookie with various values. One of these values is used to determine whether the user is visiting the website for the very first time. If they are a new visitor then I set the ViewBag with some data so that I can display this within my view.

The problem I have is that in some of my controller actions I perform a RedirectToAction. The result is OnActionExecuting is fired twice, once for the original action and then a second time when it fires the new action.

<HttpGet()>
Function Index(ByVal PageID As String) As ActionResult

    Dim wo As WebPage = Nothing

    Try
        wp = WebPages.GetWebPage(PageID)
    Catch sqlex As SqlException
        Throw
    Catch ex As Exception
           Return RedirectToAction("Index", New With {.PageID = "Home"})
       End If
    End Try

    Return View("WebPage", wp)

End Function

This is a typical example. I have a data driven website that gets a webpage from the database based on the PageID specified. If the page cannot be found in the database I redirect the user to the home page.

Is it possible to prevent the double firing in anyway or is there a better way to set a cookie? The action filter is used on multiple controllers.


Solution

  • You can save some flag value into TempData collection of controller on first executing and if this value presented, skip filter logic:

    if (filterContext.Controller.TempData["MyActionFilterAttribute_OnActionExecuting"] == null)
    {
        filterContext.Controller.TempData["MyActionFilterAttribute_OnActionExecuting"] = true;
    }