繁体   English   中英

如何使接口在所有控制器中可用?

[英]How to make Interface available in all Controllers?

我有许多控制器,我希望它们都具有一个PageConfiguration需要根据URL创建的PageConfiguration对象的接口。 除了在action方法中创建接口外,我不确定如何执行此操作,因为它们可以访问Request.QueryString ,而Controllers构造函数则没有。 我是否需要在Application_BeginRequest创建一个全局对象? 我可以采取什么方法来满足此要求? 谢谢

编辑:此代码概述了我正在尝试执行的操作:

public class ResultsController : Controller
{
    private IPageConfiguration page;

    public ResultsController()
    {
        page = new PageConfiguration("?"); // needs value from query string
    }
}

public class FactsheetController : Controller
{
    private IPageConfiguration page;

    public FactsheetController()
    {
        page = new PageConfiguration("?"); // needs value from query string
    }
}

使用动作过滤器和基本控制器功能

最简单的方法是创建一个动作过滤器。 做这些:

  1. 创建定义此属性的基本控制器类
  2. 编写一个动作过滤器,该过滤器能够解析请求的查询字符串并填充基本控制器的属性。 不要忘记将此动作过滤器属性的继承设置为true
  3. 将动作过滤器(属性)附加到控制器类

这样,您就可以使查询字符串处理变得通用和自动化,因为您不必将此操作过滤器附加到所有操作上。 它已通过继承方式附加到所有子控制器类。

您可以使用Initialize方法。 有一个定义此受保护属性的基本控制器,并在Initialize方法中设置该值。 然后,当所有控制器都从基本控制器派生时,他们将有权访问该属性。

好吧,创建全局对象使我感到困扰,因为您可能会一次处理多个请求。 在会话状态下创建对象会更好一些,因为MVC默认情况下会序列化会话中的所有请求,但是将来您仍然可能会遇到并发问题。 老实说,我认为最好的方法就是在每个需要它的动作方法中创建对象。

一种方法是使用动作过滤器。 您可以在此处看到一个简单的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM