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

时间:2010-06-21 12:44:05

标签: c# asp.net-mvc controller

我有许多控制器,我希望它们都有一个PageConfiguration对象的接口,需要根据URL创建。除了在操作方法中创建接口之外,我不确定如何执行此操作,因为它们可以访问Request.QueryString,而控制器构造函数则不能访问。我是否需要在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
    }
}

4 个答案:

答案 0 :(得分:3)

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

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

  1. 创建定义此属性的基本控制器类
  2. 编写一个动作过滤器,它能够解析请求的查询字符串并填充基本控制器的属性。不要忘记将此操作过滤器属性的继承设置为true
  3. 将动作过滤器(属性)附加到控制器类
  4. 通过这种方式,您可以使查询字符串处理变得通用和自动化,因为您不必将此操作过滤器附加到所有操作。它已经通过继承附加到所有子控制器类。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

执行此操作的一种方法是使用操作过滤器。您可以看到一个简单的示例here