在视图或控制器中获取当前区域名称

时间:2010-04-27 17:59:56

标签: c# asp.net-mvc razor

如何在视图或控制器中获取当前区域名称?

区域有ViewContext.RouteData.Values["controller"]吗?

12 个答案:

答案 0 :(得分:210)

在MVC 2中,您可以使用ViewContext.RouteData.DataTokens["area"]

答案 1 :(得分:40)

HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]

答案 2 :(得分:19)

您可以使用以下命令从控制器获取它:

ControllerContext.RouteData.DataTokens["area"]

答案 3 :(得分:9)

我刚刚写了一个b log entry about this,您可以访问它以获取更多详细信息,但我的答案是创建一个扩展方法,如下所示。

关键的问题是你从.DataTokens中获取MVC区域,从RouteData的.Values中获取控制器/动作。

public static MvcHtmlString TopMenuLink(this HtmlHelper htmlHelper, string linkText, string controller, string action, string area, string anchorTitle)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var url = urlHelper.Action(action, controller, new { @area = area });

        var anchor = new TagBuilder("a");
        anchor.InnerHtml = HttpUtility.HtmlEncode(linkText);
        anchor.MergeAttribute("href", url);
        anchor.Attributes.Add("title", anchorTitle);

        var listItem = new TagBuilder("li");
        listItem.InnerHtml = anchor.ToString(TagRenderMode.Normal);

        if (CheckForActiveItem(htmlHelper, controller, action, area))
            listItem.GenerateId("menu_active");

        return MvcHtmlString.Create(listItem.ToString(TagRenderMode.Normal));
    }

    private static bool CheckForActiveItem(HtmlHelper htmlHelper, string controller, string action, string area)
    {
        if (!CheckIfTokenMatches(htmlHelper, area, "area"))
            return false;

        if (!CheckIfValueMatches(htmlHelper, controller, "controller"))
            return false;

        return CheckIfValueMatches(htmlHelper, action, "action");
    }

    private static bool CheckIfValueMatches(HtmlHelper htmlHelper, string item, string dataToken)
    {
        var routeData = (string)htmlHelper.ViewContext.RouteData.Values[dataToken];

        if (routeData == null) return string.IsNullOrEmpty(item);

        return routeData == item;
    }

    private static bool CheckIfTokenMatches(HtmlHelper htmlHelper, string item, string dataToken)
    {
        var routeData = (string)htmlHelper.ViewContext.RouteData.DataTokens[dataToken];

        if (dataToken == "action" && item == "Index" && string.IsNullOrEmpty(routeData))
            return true;

        if (dataToken == "controller" && item == "Home" && string.IsNullOrEmpty(routeData))
            return true;

        if (routeData == null) return string.IsNullOrEmpty(item);

        return routeData == item;
    }

然后你可以按如下方式实现它:

<ul id="menu">
@Html.TopMenuLink("Dashboard", "Home", "Index", "", "Click here for the dashboard.")
@Html.TopMenuLink("Courses", "Home", "Index", "Courses", "List of our Courses.")
</ul>

答案 4 :(得分:8)

我为RouteData创建了一个返回当前区域名称的扩展方法。

public static string GetAreaName(this RouteData routeData)
{
    object area;
    if (routeData.DataTokens.TryGetValue("area", out area))
    {
        return area as string;
    }

    return null;
}

由于RouteDataControllerContext都可以使用ViewContext,因此可以在您的控制器和视图中访问它。

测试也很容易:

[TestFixture]
public class RouteDataExtensionsTests
{
    [Test]
    public void GetAreaName_should_return_area_name()
    {
        var routeData = new RouteData();
        routeData.DataTokens.Add("area", "Admin");
        routeData.GetAreaName().ShouldEqual("Admin");
    }

    [Test]
    public void GetAreaName_should_return_null_when_not_set()
    {
        var routeData = new RouteData();
        routeData.GetAreaName().ShouldBeNull();
    }
}

无需检查RouteData.DataTokens是否为空,因为它始终在内部初始化。

答案 5 :(得分:8)

在ASP.NET Core 1.0中,值可以在

中找到

ViewContext.RouteData.Values [&#34;区域&#34;];

答案 6 :(得分:3)

MVC Futures有一个AreaHelpers.GetAreaName()方法。但是,如果您使用此方法,请务必小心。使用当前区域来对运行时做出运行时决策可能会导致难以调试或不安全的代码。

答案 7 :(得分:3)

我知道这是旧的,但是,当在像ActionFilter这样的过滤器中时,上下文不能轻易地为您提供区域信息。

可以在以下代码中找到:

var routeData = filterContext.RequestContext.RouteData;

if (routeData.DataTokens["area"] != null)
    area = routeData.DataTokens["area"].ToString();

所以filterContext正在覆盖中传入,并且在RequestContext下找到了正确的RouteData。 Base级别有一个RoutData,但DataTokens的字典中没有该区域。

答案 8 :(得分:0)

我知道这是一篇非常古老的帖子,但我们可以使用与DataTokens完全相同的值属性

Url.RequestContext.RouteData.Values [&#34; action&#34;]为我工作。

答案 9 :(得分:0)

要在视图中获取区域名称,请在ASP.NET Core MVC 2.1中:

@Context.GetRouteData().Values["area"]

答案 10 :(得分:0)

在View(.NET Core 2.2)中获取区域名称:

ViewContext?.ActionDescriptor?.RouteValues["area"]

答案 11 :(得分:0)

我不知道为什么,但是被接受的答案不起作用。它返回null,例如(也许关于mvc,我使用.net core)

http://localhost:5000/Admin/CustomerGroup

我总是调试变量并从中获取数据。

尝试一下。它对我有用

var area = ViewContext.RouteData.Values["area"]

详细的逻辑示例

Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";