【问题标题】:How can I know which Area my MVC controller action is being called in?我如何知道我的 MVC 控制器动作被调用在哪个区域?
【发布时间】:2010-03-22 14:30:53
【问题描述】:

我想知道如何从控制器操作中通过 MVC 框架识别控制器所在的区域(我的意思是,不让给定区域中的所有控制器都从具有该信息的基本控制器继承) .

我对子动作(通过 RenderAction 呈现的控制器动作)特别感兴趣,例如调用父控制器的区域。

我正在使用 ASP .NET MVC 2.0 RTM

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-areas asp.net-mvc-2


    【解决方案1】:

    您可以从RouteData 字典中获取它,该字典是您的ControllerContext 的成员。

    在您的控制器方法中(这是经过测试的代码):

    string area = this.DataContext.RouteData.DataTokens["Area"].ToString();
    

    我使用的路线如下所示:

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "MyRoute",
            MyArea/{controller}/{action}/{id},
            new {controller = "MyController", Action="Index" }
        );
    }
    

    请注意,由于我的区域路线比我的根路线(在 global.asax 中)更具体,我正在注册我的区域路线首先。

    您应该使用 Phil Haack 的路由调试器检查您的路由,并确保您的 Url 访问正确的路由。

    【讨论】:

    • 它不起作用。当子操作被执行时,DataTokens 中唯一的关键是“命名空间”,其中包含我将父控制器映射到的命名空间。有没有办法可以将名称空间与该区域相匹配?
    • 嗯,我会检查你的路线。如果您使用新的运算符来隔离命名空间,它可能会清除其余的路由信息​​,但我必须相信,如果您正在使用区域并在您的区域中点击控制器方法,那么该区域会出现在您的路线数据。我将尽快发布我正在使用的路线条目。
    • 你是对的,区域键正在设置,但仅适用于我通过区域注册注册的路线。其他人(例如,我在引导程序上注册的那些)你他们分配了用于消歧的名称空间,没有得到“”空白区域集。感谢您的帮助。
    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    相关资源
    最近更新 更多