如何获得当前执行区域?

时间:2010-12-11 18:50:17

标签: asp.net-mvc

我有一个由[Project]控制器使用的类。控制器和不同区域的控制器。我怎样才能确定控制器的位置? (我想我可以查看HttpContext.Current.Request的属性 - 但我正在寻找一种“正确的”MVC方式)。谢谢。

那是:

[Project].Helpers // called by:
[Project].Controllers
[Project].Areas.[Area].Controllers
// how could I determine the caller from [Project].Helpers?

2 个答案:

答案 0 :(得分:16)

我们故意没有公开从MVC请求获取当前区域名称的方法,因为“area”只是路由的属性。它对其他用途不可靠。特别是,如果您希望控制器具有某些属性(可以考虑抽象术语,而不是System.Attribute类),这些属性可以由助手使用,那么这些属性必须在控制器本身上找到,不在区域

作为一个实际示例,如果您希望在特定区域中的任何控制器之前运行某些逻辑(如操作过滤器),则必须直接将操作过滤器与这些控制器相关联。最简单的方法是将一些MyAreaBaseController与该过滤器相关联,然后让逻辑上想要与该区域关联的每个控制器都为该类型的子类化。任何其他用法,例如查看RouteData.DataTokens [“area”]做出决定的全局过滤器,都不受支持且可能存在危险。

如果你真的需要获取当前的区域名称,可以使用RouteData.DataTokens["area"]来查找它。

答案 1 :(得分:4)

您应该可以从RouteData获取区域字符串:

// action inside a controller in an area
public ActionResult Index()
{
    var area = RouteData.DataTokens["area"];
    ....
    return View();
}

..所以你可以为这样的助手制作一个扩展方法:

public static class SomeHelper // in [Project].Helpers
{
    public static string Area(this HtmlHelper helper)
    {
        return (string)helper.ViewContext.RouteData.DataTokens["area"];
    }
}