Question

Here's the situation. I've got a single action filter that I'm using in two different controllers. The action filter is defined as:

public class ValidSubmissionAttribute : FilterAttribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var controller = filterContext.Controller;
        var session = filterContext.HttpContext.Session;
        var isValid = controller.TempData["IsValid"];
        if (isValid == null || !(bool)isValid)
        {
            SharedUtilities.LogOutUser(session, controller.ViewData.ModelState);
            filterContext.Result = SharedUtilities.GetThankYouRedirect();
        }
    }
}

When I invoke the Attribute in one controller, like this:

    [HttpPost]
    public ActionResult DoSomething(string button, Model data)
    {
        try
        {
            if (ModelState.IsValid)
            {
                TempData["IsValid"] = 
                   Request.Form["ValidRequest"] == Session.SessionID;
                Session["VerifyDoingSomethingData"] = data;
                return RedirectToAction("VerifyDoingSomething");
            }

         }
        catch (Exception ex)
        {
        }
    }

    [ValidSubmission]
    public ActionResult VerifyDoingSomething()
    {
        ViewData.Model = Session["VerifyDoingSomethingData"];
        return View("VerifyDoingSomething");
    }

it functions as expected. However, when I call it from a different controller, like this:

    [HttpPost]
    public ActionResult Index(string button, Model data)
    {
        try
        {
            if (ModelState.IsValid)
            {
                TempData["IsValid"] = 
                    Request.Form["ValidRequest"] == Session.SessionID;
                Session["ViewModel"] = data;
                return RedirectToAction("VerifyCancellation");
            }

        }
        catch (Exception ex)
        {
        }
    }

    [ValidSubmission]
    public ActionResult VerifyCancellation()
    {
        ViewData.Model = Session["ViewModel"];
        return View("VerifyCancellation");
    }

the attribute doesn't run at all. My breakpoint in the OnActionExecuting method doesn't get hit.

If I had to guess, I'd say there was some difference in the controllers or in the action methods, but they appear to be functionally similar. Any insights? Why would I be seeing such different behavior?

Was it helpful?

Solution

Aaaaand, I'm a schmuck.

Turns out there's a completely different execution path that I'd forgotten about. That path didn't have the TempData information to use in the ValidSubmisionAttribute. Everything is functioning correctly now.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top