我需要在一个控制器中为我的每个操作运行此代码。我如何做到这一点而不必为每个操作复制代码?控制器有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 { ... } }
}
您有两个选项:
- 将代码放入构造函数
-
使用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
。