ASP.NET MVC-Get Current Area Name in View or Controller

Jak uzyskać bieżącą nazwę obszaru w widoku lub kontrolerze?

Czy jest coś takiego jak ViewContext.RouteData.Values["controller"] dla obszarów?

Author: Matas Vaitkevicius, 2010-04-27

9 answers

W MVC 2 możesz użyć ViewContext.RouteData.DataTokens["area"]

 202
Author: artvolk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-09 10:56:34
HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]
 36
Author: Slava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 16:16:50

Można go pobrać z kontrolera za pomocą:

ControllerContext.RouteData.DataTokens["area"]
 17
Author: Matt Penner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 16:15:17

Właśnie napisałem wpis Bo tym , możesz odwiedzić to po więcej szczegółów, ale moją odpowiedzią było stworzenie metody rozszerzenia, pokazanej poniżej.

Kluczem było to, że wyciągasz obszar MVC z .DataTokens i kontroler / akcja z .Wartości RouteData.

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;
    }

Następnie możesz zaimplementować go jak poniżej:

<ul id="menu">
@Html.TopMenuLink("Dashboard", "Home", "Index", "", "Click here for the dashboard.")
@Html.TopMenuLink("Courses", "Home", "Index", "Courses", "List of our Courses.")
</ul>
 8
Author: christesene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 16:16:01

Utworzyłem metodę rozszerzenia dla RouteData, która zwraca bieżącą nazwę obszaru.

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

    return null;
}

Ponieważ {[2] } jest dostępny zarówno w ControllerContext, jak i ViewContext, można go uzyskać w kontrolerze i widokach.

Jest również bardzo łatwy do przetestowania:

[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();
    }
}

Nie ma potrzeby sprawdzania, czy RouteData.DataTokens jest równe null, ponieważ zawsze jest inicjowane wewnętrznie.

 7
Author: Ben Foster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 16:16:23

In ASP.NET Core 1.0 wartość znajduje się w

ViewContext./ Align = "left" / Values ["area"];

 7
Author: zerox981,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 13:09:11

Wiem, że to jest stare, ale również, gdy w filtrze takim jak ActionFilter, kontekst nie dostarcza łatwo informacji o obszarze.

Można go znaleźć w następującym kodzie:

var routeData = filterContext.RequestContext.RouteData;

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

Tak więc filterContext jest przekazywany po nadpisaniu i poprawne RouteData znajduje się pod RequestContext. Istnieje RoutData na poziomie podstawowym, ale Datatokeny nie mają obszaru w swoim słowniku.

 3
Author: gcoleman0828,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 16:15:29

MVC Futures ma powierzchnię ok.Metoda GetAreaName (). Należy jednak zachować ostrożność podczas korzystania z tej metody. Korzystanie z bieżącego obszaru do podejmowania decyzji dotyczących aplikacji może prowadzić do trudnego do debugowania lub niezabezpieczonego kodu.

 2
Author: Levi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 22:59:12

Wiem, że to bardzo stary post, ale możemy użyć właściwości Values dokładnie tak samo jak DataTokens

Url.RequestContext./ Align = "left" / Wartości ["działanie"] zadziałały dla mnie.

 0
Author: Joao Nunes da Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-14 12:24:36