【问题标题】:Why would a custom MVC3 action filter work on one controller action but not on another?为什么自定义 MVC3 动作过滤器会在一个控制器动作上起作用,而在另一个控制器动作上不起作用?
【发布时间】:2013-02-05 03:51:46
【问题描述】:

情况是这样的。我有一个在两个不同控制器中使用的单个动作过滤器。动作过滤器定义为:

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();
        }
    }
}

当我在一个控制器中调用 Attribute 时,如下所示:

    [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");
    }

它按预期运行。但是,当我从不同的控制器调用它时,如下所示:

    [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");
    }

该属性根本不运行。我在 OnActionExecuting 方法中的断点没有被命中。

如果我不得不猜测,我会说控制器或操作方法存在一些差异,但它们似乎在功能上相似。有什么见解吗?为什么我会看到如此不同的行为?

【问题讨论】:

  • 你有没有继承自一个控制器而不是另一个控制器的 BaseController,它限制了这种行为。
  • 不幸的是,没有。它们都继承自同一个基本控制器。

标签: asp.net-mvc-3 actionfilterattribute


【解决方案1】:

啊,我是个笨蛋。

原来我忘记了一条完全不同的执行路径。该路径没有要在 ValidSubmsionAttribute 中使用的 TempData 信息。现在一切正常。

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 2010-09-30
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多