3

我有一个相当大的 MVC Web 应用程序,我在每个控制器中重复一个操作,以查看客户是否已完成应用程序过程(在这种情况下,我会在他们的个人资料上设置一个标志,我会检查)。理想情况下,我想从每个操作方法中删除此代码,并将其应用于所有返回操作结果的操作方法。

4

2 回答 2

5

您可以创建一个自定义属性来为您处理此问题,您可以在 Controller 级别或 ActionResult 级别拥有该属性。

[CompletedApplication("User")]
public ActionResult YourAction
{
    return View();
}

public class CompletedApplicationAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // Your logic here
        return true;
    }
}
于 2013-09-24T07:34:13.023 回答
3

如果所有预期的控制器都从某个 BaseController 继承而不是使用它,则可以设置通用行为。

public class HomeController : BaseController
{
}

和 BaseContoller 会像

public class BaseController : Controller
{
     protected BaseController(common DI)
     {
     }

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
      // some logic after action method get executed      
        base.OnActionExecuted(filterContext);
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
       // some login before any action method get executed

       string actionName = filterContext.RouteData.Values["action"].ToString(); // Index.en-US

        filterContext.Controller.ViewBag.SomeFlage= true;
    }

  // If Project is in MVC 4 - AsyncContoller support, 
  //below method is called before any action method get called, Action Invoker

   protected override IActionInvoker CreateActionInvoker()
    {       
        return base.CreateActionInvoker();
    }
}
于 2013-09-24T08:07:26.867 回答