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?
9 answers
W MVC 2 możesz użyć ViewContext.RouteData.DataTokens["area"]
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"]
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"]
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>
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.
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"];
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.
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.
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.
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