Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取视图或控制器中的当前区域名称_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 获取视图或控制器中的当前区域名称

C# 获取视图或控制器中的当前区域名称,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,如何在视图或控制器中获取当前区域名称 区域是否有类似于ViewContext.RouteData.Values[“controller”]的内容?有一个AreaHelpers.GetAreaName()方法。但是,如果使用此方法,请小心。使用当前区域对应用程序进行运行时决策可能会导致难以调试或代码不安全。从MVC2开始,您可以使用ViewContext.RouteData.DataTokens[“区域”]您可以使用以下方法从控制器获取它: ControllerContext.RoutedData

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


区域是否有类似于
ViewContext.RouteData.Values[“controller”]
的内容?

有一个AreaHelpers.GetAreaName()方法。但是,如果使用此方法,请小心。使用当前区域对应用程序进行运行时决策可能会导致难以调试或代码不安全。

从MVC2开始,您可以使用
ViewContext.RouteData.DataTokens[“区域”]
您可以使用以下方法从控制器获取它:

ControllerContext.RoutedData.DataTokens[“区域”]
我刚刚写了一个b,您可以访问它了解更多详细信息,但我的答案是创建一个扩展方法,如下所示

关键在于从.DataTokens中提取MVC区域,从RoutedData的.value中提取控制器/操作

public static MvcHtmlString-TopMenuLink(此HtmlHelper、字符串链接文本、字符串控制器、字符串操作、字符串区域、字符串锚定)
{
var urlHelper=新的urlHelper(htmlHelper.ViewContext.RequestContext);
var url=urlHelper.Action(Action,controller,new{@area=area});
var anchor=新标记生成器(“a”);
anchor.InnerHtml=HttpUtility.HtmlEncode(linkText);
anchor.MergeAttribute(“href”,url);
anchor.Attributes.Add(“标题”,anchorttle);
var listItem=新标记生成器(“li”);
listItem.InnerHtml=anchor.ToString(TagRenderMode.Normal);
if(检查活动项(htmlHelper、控制器、操作、区域))
listItem.GenerateId(“菜单”处于活动状态);
返回MvcHtmlString.Create(listItem.ToString(TagRenderMode.Normal));
}
活动项的专用静态布尔检查(HtmlHelper HtmlHelper、字符串控制器、字符串操作、字符串区域)
{
如果(!CheckIfTokenMatches(htmlHelper,区域,“区域”))
返回false;
如果(!CheckIfValueMatches(htmlHelper、控制器、“控制器”))
返回false;
返回CheckIfValueMatches(htmlHelper,action,“action”);
}
私有静态bool CheckIfValueMatches(HtmlHelper HtmlHelper、字符串项、字符串数据令牌)
{
var routeData=(字符串)htmlHelper.ViewContext.routeData.Values[dataToken];
if(routeData==null)返回字符串.IsNullOrEmpty(item);
返回RoutedData==项目;
}
私有静态bool CheckIfTokenMatches(HtmlHelper HtmlHelper、字符串项、字符串数据令牌)
{
var routeData=(字符串)htmlHelper.ViewContext.routeData.DataTokens[dataToken];
if(dataToken==“action”&&item==“Index”&&string.IsNullOrEmpty(routeData))
返回true;
if(dataToken==“controller”&&item==“Home”&&string.IsNullOrEmpty(routeData))
返回true;
if(routeData==null)返回字符串.IsNullOrEmpty(item);
返回RoutedData==项目;
}
然后您可以按如下方式实现它:

<ul id="menu">
@Html.TopMenuLink("Dashboard", "Home", "Index", "", "Click here for the dashboard.")
@Html.TopMenuLink("Courses", "Home", "Index", "Courses", "List of our Courses.")
</ul>
    @TopMenuLink(“仪表板”、“主页”、“索引”、“单击此处查看仪表板”) @TopMenuLink(“课程”、“主页”、“索引”、“课程”、“我们的课程列表”)

我知道这很旧,但是,在ActionFilter这样的过滤器中,上下文不容易为您提供区域信息

可在以下代码中找到:

var routeData=filterContext.RequestContext.routeData;
if(routeData.DataTokens[“area”]!=null)
area=routeData.DataTokens[“area”].ToString();

因此,filterContext在重写时被传入,并且在RequestContext下找到了正确的RoutedData。基本级别上有一个RoutedData,但DataToken在其字典中没有区域。

我为
RoutedData
创建了一个扩展方法,返回当前区域名称

公共静态字符串GetAreaName(此RoutedData RoutedData)
{
目标区域;
if(routeData.DataTokens.TryGetValue(“区域”,out区域))
{
返回区域为字符串;
}
返回null;
}
由于
routedData
ControllerContext
ViewContext
上都可用,因此可以在控制器和视图中访问它

它也很容易测试:

[TestFixture]
公共类路由扩展测试
{
[测试]
public void GetAreaName\u应该\u返回\u area\u name()
{
var routeData=新routeData();
routeData.DataTokens.Add(“区域”、“管理”);
routeData.GetAreaName().ShouldEqual(“Admin”);
}
[测试]
public void GetAreaName在未设置时应返回null
{
var routeData=新routeData();
routeData.GetAreaName().ShouldBeNull();
}
}
无需检查
RoutedData.DataTokens
是否为空,因为它始终在内部初始化。

HttpContext.Current.Request.RequestContext.RoutedData.DataTokens[“area”]

我知道这是一篇非常古老的文章,但我们可以使用与DataToken完全相同的方法使用Values属性


Url.RequestContext.RouteData.Values[“action”]对我很有用。

在ASP.NET Core 1.0中,该值位于


ViewContext.RouteData.Values[“area”]

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

@Context.GetRouteData().Values["area"]
获取视图中的区域名称(.NET Core 2.2):


我不知道为什么,但公认的答案是无效的。它返回空值,例如(可能是关于mvc,我使用.NETCore)

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

试试这个。它对我有用

var area = ViewContext.RouteData.Values["area"]
详细的逻辑示例

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

如果不在区域中,则ViewContext.RouteData.DataTokens[“区域”]==null.Lol。。这是你的玩笑@Dante。。。公平地说,它被称为
ASP.NETCore1.0
,而不是
MVC6
。:-)仅供参考-找出我的ajax帖子出了什么问题但不起作用。。。请检查您的ajax请求在URL中的区域。。。他们可能仍然会发现!!!视野很好,但他们无法保持该区域。。。如果缺少url,则
Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";