ASP.Net MVC3 控制器 "globals"



我需要在一个控制器中为我的每个操作运行此代码。我如何做到这一点而不必为每个操作复制代码?控制器有init方法吗?

System.Web.HttpSessionStateBase Sess = HttpContext.Session;
string pid = (Sess["PID"] != null ? Sess["PID"].ToString() : "");
string LogonTicket = (Sess["LogonTicket"] != null ? Sess["LogonTicket"].ToString() : "");

为什么不将其封装到基本控制器中的属性中?

class abstract YourControllerBase : Controller
{
   public string Pid { get { ... } }
   public string LogonTicket { get { ... } }
}

您有两个选项:

  1. 将代码放入构造函数
  2. 使用OnActionExecuting

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
    }
    

我认为,尽管绝对正确,但抽象类和基于继承的答案会让"提问者"感到不舒服,因为他正试图处理一个比继承更简单的案例。

一个简短的答案-只需将代码放入控制器的构造函数中。

例如:

public HomeController: Controller {
    private string _pid;
    private string _logonTicket;
    public HomeController() {
        System.Web.HttpSessionStateBase Sess = HttpContext.Session;
        _pid = (Sess["PID"] != null ? Sess["PID"].ToString() : "");
        _logonTicket = (Sess["LogonTicket"] != null ? Sess["LogonTicket"].ToString() : "");
    }

//REST OF YOUR CONTROLLER CODE
}

现在,您可以从控制器操作的代码中访问_pid_logonTicket

最新更新