0

これが状況です。2 つの異なるコントローラーで使用している単一のアクション フィルターがあります。アクション フィルターは次のように定義されます。

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

次のように、1 つのコントローラーで属性を呼び出すと、次のようになります。

    [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 メソッドのブレークポイントがヒットしません。

推測するに、コントローラやアクション メソッドに多少の違いがあると思いますが、機能的には似ているように見えます。洞察はありますか?なぜこのような異なる動作が見られるのでしょうか?

4

1 に答える 1

0

Aaaaand、私はシュマックです。

私が忘れていた完全に異なる実行パスがあることがわかりました。そのパスには、ValidSubmisionAttribute で使用する TempData 情報がありませんでした。現在、すべてが正しく機能しています。

于 2013-02-05T15:51:33.840 に答える