基础控制器

时间:2011-08-21 23:56:38

标签: asp.net-mvc controller

我有一个ApplicationController,我的应用程序中的每个控制器都继承。

public abstract class ApplicationController : Controller
public class HomeController : ApplicationController
public class AnnouncementController : ApplicationController

我的应用程序(IntraNet)也使用Windows身份验证并提取当前用户域登录名。当用户的登录名不包含站点ID时,我需要控制器在下拉列表中显示一个视图,最好是一个带有站点列表的小弹出窗口供用户选择。

问题1:应该在ApplicationController中实现此功能,以便所有派生类都不需要实现此检查吗?如果是,我如何在派生类实例化期间调用此方法?目前ApplicationController只包含构造函数而没有其他方法 问题2:在用户会话期间,如何将此选定的站点ID与会话和其他类型的持久性存储一起保留?

感谢。

1 个答案:

答案 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; }
    }
}

将属性设为公开将为您的自定义属性提供访问权限。