繁体   English   中英

向所有ActionResult注入AC#函数

[英]Inject A C# Function to all of ActionResult

我们有一个Asp.net MVC项目,它具有1000多个ActionResult,我需要将所有这些都添加一个C#函数以检查Session的值。 那么,您对此有何提议? 以下两行包含了我的Controller和ActionResult的一些示例:

    public partial class CRMController : Controller
    {
       public ActionResult OrganizationCategory()
       {
        //I want add a C# function here 
       }
    }
    public partial class BaseInfoController : Controller
    {
       public ActionResult Lead()
       {
         //I Want Add a C# Function here
       }
     }

您可以为此使用ActionFilters

基本的ActionFilterAttribute类具有以下可以覆盖的方法:

OnActionExecuting –执行控制器操作之前,将调用此方法。 OnActionExecuted –执行控制器动作后调用此方法。 OnResultExecuting –在执行控制器动作结果之前调用此方法。 OnResultExecuted –执行控制器动作结果后调用此方法。

这里是完整的代码示例!

 public class LogActionFilter : ActionFilterAttribute

 {
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
           Log("OnActionExecuting", filterContext.RouteData);       
      }

      public override void OnActionExecuted(ActionExecutedContext filterContext)
      {
           Log("OnActionExecuted", filterContext.RouteData);       
      }

      public override void OnResultExecuting(ResultExecutingContext filterContext)
      {
           Log("OnResultExecuting", filterContext.RouteData);       
      }

      public override void OnResultExecuted(ResultExecutedContext filterContext)
      {
           Log("OnResultExecuted", filterContext.RouteData);       
      }

      private void Log(string methodName, RouteData routeData)
      {
           var controllerName = routeData.Values["controller"];
           var actionName = routeData.Values["action"];
           var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
           Debug.WriteLine(message, "Action Filter Log");
      }
 }

 [LogActionFilter]
 public class HomeController : Controller
 {
      public ActionResult Index()
      {
           return View();
      }

      public ActionResult About()
      {

           return View();
      }
 }

请在该检查会话中创建一个动作过滤器属性。 然后创建一个基本控制器,然后在该控制器中应用此属性。 然后,使用您的业务控制器继承此基本控制器。

public class MySessionCheckFilterAttribute : ActionFilterAttribute
{
   public override void OnActionExecuting(ActionExecutingContext context)
   {

       //Check Session Method()
       //if(SessionNotAvaliable)
       //{
       //    throw new businessException;
       //}

       base.OnActionExecuting(context);
    }
}

[MySessionCheckFilterAttribute]
public class BaseController:Controller
{

}

public class YourController_One: BaseController
{
    //Do anything
}

public class YourController_Two : BaseController
{
    //Do anything
}

由于您的职能是检查会话,因此我认为这可能与授权过程有关。 如果是这样,您可以尝试使用AuthorizeAttribute

示例:在每个标记有[AuthorizeAttribute]函数上检查Session["username"] [AuthorizeAttribute]

public class SessionAuthAttribute : AuthorizeAttribute
    {
        public SessionAuthAttribute() { }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //base.OnAuthorization(filterContext);
            var userID = filterContext.HttpContext.Session["username"];
            if (userID == null)
            {
                filterContext.Result = new RedirectResult("/Home");
            }
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                    {
                        controller = "Home",
                        action = "Index"
                    })
                    );
        }
    }

在控制器中:

[SessionAuthAttribute] //Applied for whole Controller
 public class HomeController : Controller
 {
      [SessionAuthAttribute] //Applied for 1 function
      public ActionResult Index()
      {
           return View();
      }

      public ActionResult About()
      {

           return View();
      }
 }

编辑:您可以在MVC项目的文件夹属性中创建此类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM