2010-04-27 3 views

답변

194

MVC 2에서는 ViewContext.RouteData.DataTokens["area"]

+22

영역에 없으면 ViewContext.RouteData.DataTokens [ "area"] == null입니다. – user202448

+14

MVC 3에서 동일한 작업 –

+21

또한 MVC4에서 작동합니다. – CallMeLaNN

2

MVC Futures에는 AreaHelpers.GetAreaName() 메서드가 있습니다. 그러나이 방법을 사용하는 경우에는주의해야합니다. 현재 영역을 사용하여 응용 프로그램에 대한 런타임 결정을 내리면 디버그하기 어렵거나 안전하지 않은 코드가 발생할 수 있습니다.

+1

컨트롤러와 같은 방법이 있습니까?나는 문자열 리터럴을 콜렉션에 사용하는 것을 싫어한다. –

+0

은 컨트롤러에'this.GetName()'을 사용하고 현재 Method에는'MethodBase.GetCurrentMethod(). Name'을 사용합니다. – Moes

16

당신은 사용 컨트롤러에서 그것을 얻을 수 있습니다 사용할 수 있습니다

난 그냥 AB log entry about this을 썼다
ControllerContext.RouteData.DataTokens["area"] 
+0

MVC3의 새로운 기능입니까, 아니면 MVC2와 호환됩니까? – user202448

+0

@ user202338 영역이 MVC2에서 도입되었으므로 의심 스럽지만 DataTokens 컬렉션을 채우는 방식을 변경했는지 확신 할 수 없습니다. 이 게시물은 [link] (http://forums.asp.net/t/1549680.aspx/1)에서 MVC2에서 사용하는 방법에 대해 설명합니다. –

7

, 당신은 자세한 내용은이를 방문 할 수 있습니다,하지만 내 대답에 있었다 아래에 표시된 확장 메서드를 만듭니다.

키커는 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> 
+0

어떤 이유에서 나는'Values'에서'area' 토큰을 찾을 수 없지만'DataTokens'를 들여다 볼 필요가있었습니다 ... 이유가 없습니다. – Syska

3

나는이 오래 알고, 또한, 때 ActionFilter 같은 필터, 상황에 맞는 쉽게 영역의 정보를 제공하지 않습니다.

그것은 다음 코드에서 찾을 수 있습니다 : 그래서 filterContext가 재정의 올바른으로 RouteData에서 전달되는

var routeData = filterContext.RequestContext.RouteData; 

if (routeData.DataTokens["area"] != null) 
    area = routeData.DataTokens["area"].ToString(); 

은 RequestContext에서 발견된다. 기본 레벨에는 RoutData가 있지만 DataTokens에는 사전에 해당 영역이 없습니다.

6

현재 영역 이름을 반환하는 RouteData에 대한 확장 방법을 만들었습니다. RouteData 이후

public static string GetAreaName(this RouteData routeData) 
{ 
    object area; 
    if (routeData.DataTokens.TryGetValue("area", out area)) 
    { 
     return area as string; 
    } 

    return null; 
} 

는 컨트롤러와 뷰에 액세스 할 수 있습니다 모두 ControllerContextViewContext에서 사용할 수 있습니다.

또한 테스트에 매우 쉽습니다 :이 항상 내부적으로 초기화 이후 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(); 
    } 
} 

.

30
HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"] 
+2

보기 또는 컨트롤러가 아닌 경우 지역 정보를 얻는 데는 * 보편적 인 방법입니다. 게시 해 주셔서 감사합니다. – bdrelling

0

나는이 아주 아주 오래된 게시물입니다 알고 있지만 우리는

Url.RequestContext.RouteData.Values ​​[ "행동이"] 나를 위해 일한 DataTokens로 값을 속성 정확히 같은 방법을 사용할 수 있습니다.

ASP.NET 코어
3

1.0 값

ViewContext.RouteData.Values ​​[ "영역"]에서 발견된다;