132

ビューまたはコントローラーで現在のエリア名を取得するにはどうすればよいですか?

エリアのようなものはありViewContext.RouteData.Values["controller"]ますか?

4

13 に答える 13

229

MVC2以降は使用できますViewContext.RouteData.DataTokens["area"]

于 2010-05-09T10:56:34.763 に答える
48
HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]
于 2013-04-11T16:23:01.993 に答える
20

次を使用してコントローラーから取得できます。

ControllerContext.RouteData.DataTokens["area"]
于 2011-07-29T19:51:45.343 に答える
13

ASP.NET Core 1.0では、値は次の場所にあります。

ViewContext.RouteData.Values ["area"];

于 2016-11-22T13:09:11.477 に答える
9

これについてabログエントリを作成しました。詳細については、これにアクセスできますが、私の答えは、以下に示す拡張メソッドを作成することでした。

重要なキッカーは、MVCエリアを.DataTokensからプルし、コントローラー/アクションを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>
于 2011-12-01T01:32:48.423 に答える
8

RouteData現在のエリア名を返す拡張メソッドを作成しました。

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

    return null;
}

RouteData両方で利用可能でありControllerContextViewContextコントローラーとビューでアクセスできるためです。

テストも非常に簡単です。

[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.DataTokensnullは常に内部で初期化されるため、nullかどうかを確認する必要はありません。

于 2013-01-19T10:53:38.580 に答える
6

ビュー(.NET Core 2.2)でエリア名を取得します。

ViewContext?.ActionDescriptor?.RouteValues["area"]
于 2019-03-06T14:27:16.133 に答える
3

MVC FuturesにはAreaHelpers.GetAreaName()メソッドがあります。ただし、この方法を使用する場合は注意が必要です。現在の領域を使用してアプリケーションに関する実行時の決定を行うと、デバッグが困難になったり、コードが安全でなくなったりする可能性があります。

于 2010-04-27T22:59:12.083 に答える
3

これは古いことですが、ActionFilterのようなフィルターでは、コンテキストがエリア情報を簡単に提供することはできません。

次のコードで見つけることができます:

var routeData = filterContext.RequestContext.RouteData;

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

したがって、filterContextはオーバーライドで渡され、正しいRouteDataがRequestContextの下にあります。ベースレベルにはRoutDataがありますが、DataTokenにはそのディクショナリに領域がありません。

于 2012-12-27T20:36:10.710 に答える
2

ビューでエリア名を取得するには、ASP.NET CoreMVC2.1で次のようにします。

@Context.GetRouteData().Values["area"]
于 2019-01-18T16:25:18.717 に答える
1

理由はわかりませんが、受け入れられた答えが機能していません。それは例えばでnullを返します(多分mvcについて、私は.netコアを使用します)

http:// localhost:5000 / Admin / CustomerGroup

私は常に変数をデバッグし、そこからデータをフェッチします。

これを試して。わたしにはできる

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

詳細な論理例

Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";
于 2020-03-12T14:07:32.397 に答える
0

これは非常に古い投稿ですが、DataTokensとまったく同じ方法でValuesプロパティを使用できます。

Url.RequestContext.RouteData.Values["action"]は私のために働きました。

于 2016-08-14T12:24:36.213 に答える
0

Asp .Net Core 3.1

シナリオ:ViewCompnentInvokeメソッドで現在のエリア名を取得したかった。

  public IViewComponentResult Invoke()
  {
       string areaName = this.RouteData.Values["area"];

       //Your code here...

       return View(items);
  }
于 2022-02-19T11:35:45.907 に答える