【问题标题】:Base Controller基本控制器
【发布时间】:2011-08-21 23:56:37
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: asp.net-mvc controller


    【解决方案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; }
        }
    }
    

    公开属性将使您的自定义属性能够访问它们。

    【讨论】:

    • 如何使用新属性在 ApplicationController 中返回查看结果?
    • 您可以在属性中设置 ActionResult(例如重定向到登录或 404 页面),也可以像往常一样使用您的操作。不过,我需要更多的背景和细节才能真正回答这个问题。
    • 当用户的 Windows 登录名不包含“XYZ”而不是显示包含所有站点名称供用户选择的视图页面或 JSON 时,我需要什么?我不知道如何在 ApplicationController 类中进行操作,以及如何从派生类中调用它。谢谢。
    • 好吧,您可以创建一个IHttpHandler 来检查每个传入的请求并相应地重定向,或者您可以使用覆盖OnActionExecuting 的自定义属性(就像我发布的那个)来装饰您的基类。使用该属性,您可以强制重定向到基于用户身份执行您正在谈论的操作的操作。如果您需要有关该属性的更多帮助,请告诉我,我可以发布更多代码。
    猜你喜欢
    • 2011-10-28
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多