我有一个ApplicationController,我的应用程序中的每个控制器都继承。
public abstract class ApplicationController : Controller
public class HomeController : ApplicationController
public class AnnouncementController : ApplicationController
我的应用程序(IntraNet)也使用Windows身份验证并提取当前用户域登录名。当用户的登录名不包含站点ID时,我需要控制器在下拉列表中显示一个视图,最好是一个带有站点列表的小弹出窗口供用户选择。
问题1:应该在ApplicationController中实现此功能,以便所有派生类都不需要实现此检查吗?如果是,我如何在派生类实例化期间调用此方法?目前ApplicationController只包含构造函数而没有其他方法 问题2:在用户会话期间,如何将此选定的站点ID与会话和其他类型的持久性存储一起保留?
感谢。
答案 0 :(得分:1)
如果每次调用都需要进行此检查,我会创建一个属性并用它来装饰基本控制器类。请务必使用AttributeUsage
修饰新属性,以便在所有继承控制器上调用它。
[AttributeUsage (AttributeTargets.All, Inherited = true)]
public CheckStuffAttribute : ActionFilterAttribute
{
// This is one method you can override to get access
// to everything going on before any actions are executed.
public override void OnActionExecuting (ActionExecutingContext filterContext)
{
// Do your checks, or whatever you need, here
}
}
...
[CheckStuff]
public abstract class ApplicationController : Controller { ... }
关于第二个问题,您可以在基类上创建使用Session作为其后备存储的属性。
[CheckStuff]
public abstract class ApplicationController : Controller
{
public string DataToKeepAlive
{
get { return (string)Session["MyKey"]; }
set { Session["MyKey"] = value; }
}
}
将属性设为公开将为您的自定义属性提供访问权限。