我有一个由[Project]控制器使用的类。控制器和不同区域的控制器。我怎样才能确定控制器的位置? (我想我可以查看HttpContext.Current.Request的属性 - 但我正在寻找一种“正确的”MVC方式)。谢谢。
那是:
[Project].Helpers // called by:
[Project].Controllers
[Project].Areas.[Area].Controllers
// how could I determine the caller from [Project].Helpers?
答案 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"];
}
}