1

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

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

3 回答 3

3

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

class abstract YourControllerBase : Controller
{
   public string Pid { get { ... } }
   public string LogonTicket { get { ... } }
}
于 2012-08-21T15:13:47.053 回答
2

你有几个选择:

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

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
    }
    
于 2012-08-21T15:15:59.073 回答
1

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

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

例如:

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从控制器操作的代码。

于 2012-08-21T15:23:03.833 回答