use*_*448 125 c# asp.net-mvc razor
如何在视图或控制器中获取当前区域名称?
ViewContext.RouteData.Values["controller"]区域有什么吗?
art*_*olk 215
在MVC 2中你可以使用 ViewContext.RouteData.DataTokens["area"]
Sla*_*ava 43
HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]
Run Code Online (Sandbox Code Playgroud)
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)
在ASP.NET Core 1.0中,可以找到值
ViewContext.RouteData.Values [ "区域"];
我创建了一个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,因为它始终在内部初始化.
在视图中获取区域名称(.NET Core 2.2):
ViewContext?.ActionDescriptor?.RouteValues["area"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
62689 次 |
| 最近记录: |