뷰 또는 컨트롤러에서 현재 영역 이름을 어떻게 구합니까?ASP.NET MVC - 뷰 또는 컨트롤러에서 현재 영역 이름 가져 오기
영역에 대해 ViewContext.RouteData.Values["controller"]
같은 것이 있습니까?
뷰 또는 컨트롤러에서 현재 영역 이름을 어떻게 구합니까?ASP.NET MVC - 뷰 또는 컨트롤러에서 현재 영역 이름 가져 오기
영역에 대해 ViewContext.RouteData.Values["controller"]
같은 것이 있습니까?
MVC 2에서는 ViewContext.RouteData.DataTokens["area"]
MVC Futures에는 AreaHelpers.GetAreaName() 메서드가 있습니다. 그러나이 방법을 사용하는 경우에는주의해야합니다. 현재 영역을 사용하여 응용 프로그램에 대한 런타임 결정을 내리면 디버그하기 어렵거나 안전하지 않은 코드가 발생할 수 있습니다.
컨트롤러와 같은 방법이 있습니까?나는 문자열 리터럴을 콜렉션에 사용하는 것을 싫어한다. –
은 컨트롤러에'this.GetName()'을 사용하고 현재 Method에는'MethodBase.GetCurrentMethod(). Name'을 사용합니다. – Moes
당신은 사용 컨트롤러에서 그것을 얻을 수 있습니다 사용할 수 있습니다
난 그냥 AB log entry about this을 썼다ControllerContext.RouteData.DataTokens["area"]
MVC3의 새로운 기능입니까, 아니면 MVC2와 호환됩니까? – user202448
@ user202338 영역이 MVC2에서 도입되었으므로 의심 스럽지만 DataTokens 컬렉션을 채우는 방식을 변경했는지 확신 할 수 없습니다. 이 게시물은 [link] (http://forums.asp.net/t/1549680.aspx/1)에서 MVC2에서 사용하는 방법에 대해 설명합니다. –
, 당신은 자세한 내용은이를 방문 할 수 있습니다,하지만 내 대답에 있었다 아래에 표시된 확장 메서드를 만듭니다.
키커는 RouteData의 .Values에서 .DataTokens 및 컨트롤러/동작에서 MVC 영역을 가져 오는 것이 었습니다.
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>
어떤 이유에서 나는'Values'에서'area' 토큰을 찾을 수 없지만'DataTokens'를 들여다 볼 필요가있었습니다 ... 이유가 없습니다. – Syska
나는이 오래 알고, 또한, 때 ActionFilter 같은 필터, 상황에 맞는 쉽게 영역의 정보를 제공하지 않습니다.
그것은 다음 코드에서 찾을 수 있습니다 : 그래서 filterContext가 재정의 올바른으로 RouteData에서 전달되는
var routeData = filterContext.RequestContext.RouteData;
if (routeData.DataTokens["area"] != null)
area = routeData.DataTokens["area"].ToString();
은 RequestContext에서 발견된다. 기본 레벨에는 RoutData가 있지만 DataTokens에는 사전에 해당 영역이 없습니다.
현재 영역 이름을 반환하는 RouteData
에 대한 확장 방법을 만들었습니다. RouteData
이후
public static string GetAreaName(this RouteData routeData)
{
object area;
if (routeData.DataTokens.TryGetValue("area", out area))
{
return area as string;
}
return null;
}
는 컨트롤러와 뷰에 액세스 할 수 있습니다 모두 ControllerContext
및 ViewContext
에서 사용할 수 있습니다.
또한 테스트에 매우 쉽습니다 :이 항상 내부적으로 초기화 이후 RouteData.DataTokens
가 null의 경우 체크 할 필요가 없습니다
[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();
}
}
.
HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]
보기 또는 컨트롤러가 아닌 경우 지역 정보를 얻는 데는 * 보편적 인 방법입니다. 게시 해 주셔서 감사합니다. – bdrelling
나는이 아주 아주 오래된 게시물입니다 알고 있지만 우리는
Url.RequestContext.RouteData.Values [ "행동이"] 나를 위해 일한 DataTokens로 값을 속성 정확히 같은 방법을 사용할 수 있습니다.
ASP.NET 코어1.0 값
ViewContext.RouteData.Values [ "영역"]에서 발견된다;
영역에 없으면 ViewContext.RouteData.DataTokens [ "area"] == null입니다. – user202448
MVC 3에서 동일한 작업 –
또한 MVC4에서 작동합니다. – CallMeLaNN