ASP.NET MVC - 在视图或控制器中获取当前区域名称

use*_*448 125 c# asp.net-mvc razor

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

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

art*_*olk 215

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

  • ......并在MVC5 :) (23认同)
  • 如果不在某个区域,ViewContext.RouteData.DataTokens ["area"] == null. (22认同)
  • 大声笑..这个笑话在你@Dante上......好吧,公平地称它为`ASP.NET Core 1.0`而不是`MVC6` .. :-) (4认同)

Sla*_*ava 43

HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]
Run Code Online (Sandbox Code Playgroud)

  • 如果您不在视图或控制器中,这是获取区域信息的最佳*通用*方式.感谢您发布此内容! (3认同)

Mat*_*ner 19

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

ControllerContext.RouteData.DataTokens["area"]
Run Code Online (Sandbox Code Playgroud)


小智 9

我刚刚写了关于此的 ab 日志条目,您可以访问它以获取更多详细信息,但我的答案是创建一个扩展方法,如下所示.

关键的问题是你从.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;
    }
Run Code Online (Sandbox Code Playgroud)

然后你可以实现如下:

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


zer*_*981 9

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

ViewContext.RouteData.Values [ "区域"];

  • 我可以确认这适用于 ASP.NET Core 2.2 (2认同)
  • 这也适用于使用 .Net Core 3.1 的 Razor 页面 (2认同)

Ben*_*ter 8

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

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

    return null;
}
Run Code Online (Sandbox Code Playgroud)

由于RouteData两者都可用ControllerContext,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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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


SZL*_*SZL 5

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

ViewContext?.ActionDescriptor?.RouteValues["area"]
Run Code Online (Sandbox Code Playgroud)