ビューまたはコントローラーで現在のエリア名を取得するにはどうすればよいですか?
エリアのようなものはありViewContext.RouteData.Values["controller"]
ますか?
ビューまたはコントローラーで現在のエリア名を取得するにはどうすればよいですか?
エリアのようなものはありViewContext.RouteData.Values["controller"]
ますか?
MVC2以降は使用できますViewContext.RouteData.DataTokens["area"]
HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]
次を使用してコントローラーから取得できます。
ControllerContext.RouteData.DataTokens["area"]
ASP.NET Core 1.0では、値は次の場所にあります。
ViewContext.RouteData.Values ["area"];
これについて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>
RouteData
現在のエリア名を返す拡張メソッドを作成しました。
public static string GetAreaName(this RouteData routeData)
{
object area;
if (routeData.DataTokens.TryGetValue("area", out area))
{
return area as string;
}
return null;
}
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();
}
}
RouteData.DataTokens
nullは常に内部で初期化されるため、nullかどうかを確認する必要はありません。
ビュー(.NET Core 2.2)でエリア名を取得します。
ViewContext?.ActionDescriptor?.RouteValues["area"]
MVC FuturesにはAreaHelpers.GetAreaName()メソッドがあります。ただし、この方法を使用する場合は注意が必要です。現在の領域を使用してアプリケーションに関する実行時の決定を行うと、デバッグが困難になったり、コードが安全でなくなったりする可能性があります。
これは古いことですが、ActionFilterのようなフィルターでは、コンテキストがエリア情報を簡単に提供することはできません。
次のコードで見つけることができます:
var routeData = filterContext.RequestContext.RouteData;
if (routeData.DataTokens["area"] != null)
area = routeData.DataTokens["area"].ToString();
したがって、filterContextはオーバーライドで渡され、正しいRouteDataがRequestContextの下にあります。ベースレベルにはRoutDataがありますが、DataTokenにはそのディクショナリに領域がありません。
ビューでエリア名を取得するには、ASP.NET CoreMVC2.1で次のようにします。
@Context.GetRouteData().Values["area"]
理由はわかりませんが、受け入れられた答えが機能していません。それは例えばでnullを返します(多分mvcについて、私は.netコアを使用します)
私は常に変数をデバッグし、そこからデータをフェッチします。
これを試して。わたしにはできる
var area = ViewContext.RouteData.Values["area"]
詳細な論理例
Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";
これは非常に古い投稿ですが、DataTokensとまったく同じ方法でValuesプロパティを使用できます。
Url.RequestContext.RouteData.Values["action"]は私のために働きました。
Asp .Net Core 3.1
シナリオ:ViewCompnentInvokeメソッドで現在のエリア名を取得したかった。
public IViewComponentResult Invoke()
{
string areaName = this.RouteData.Values["area"];
//Your code here...
return View(items);
}