【问题标题】:Run a method before each Action in MVC3在 MVC3 中的每个 Action 之前运行一个方法
【发布时间】:2012-03-22 20:56:52
【问题描述】:

我们如何在 MVC3 中运行每个 Action 之前运行一个方法?

我知道我们可以对OnActionExecuting 使用以下方法:

public class ValidateUserSessionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      ...
    }
}

但是我们怎样才能在 ActionExecuting 之前运行一个方法呢?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 action-filter


    【解决方案1】:

    您正在寻找Controller.ExecuteCore()

    这个函数在每个动作调用之前被调用。您可以在控制器或基本控制器中覆盖它。基于来自 Nadeem Afana 的 cookie 设置文化基础的示例:

       public class BaseController : Controller
       {
          protected override void ExecuteCore()
          {
             string cultureName = null;
             // Attempt to read the culture cookie from Request
             HttpCookie cultureCookie = Request.Cookies["_culture"];
             if (cultureCookie != null)
             {
                cultureName = cultureCookie.Value;
             }
             else
             {
                if (Request.UserLanguages != null)
                {
                   cultureName = Request.UserLanguages[0]; // obtain it from HTTP header AcceptLanguages
                }
                else 
                {
                   cultureName = "en-US"; // Default value
                }
             }
    
             // Validate culture name
             cultureName = CultureHelper.GetImplementedCulture(cultureName); // This is safe
    
    
             // Modify current thread's cultures            
             Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
             Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
    
             base.ExecuteCore();
          }
       }
    

    【讨论】:

    • 如果您在任何地方都需要它,请覆盖 BeginExecute。即:文件上传
    【解决方案2】:

    我还建议研究AOP,PostsharpCastle Windsor 可以轻松处理诸如任务。

    【讨论】:

      【解决方案3】:

      你也可以考虑在 global.asax 中使用 Application_BeginRequest 方法

      【讨论】:

      • 我需要在方法中使用Request.CookiesSession。但我们无法在Application_BeginRequest 中访问它们
      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多