2016-11-06 4 views
1

저는 HomeController가 있고 많은 액션이 있습니다. 사용자가 집에 입력하지 않고 내 행동을 방문하길 바랍니다. 여기에 루트가 있습니다Mvc에서 HomeController에서 홈을 제거하는 방법

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

이 경우 컨트롤러 이름을 입력하지 않기를 바랍니다. 어떻게해야합니까? 아니면 필수입니까?

+0

e 컨트롤러의 각 동작에 대한 특정 경로 –

답변

2

솔루션 01 (속성 라우팅)

 routes.MapMvcAttributeRoutes(); 
RouteConfig

에서 다른 경로의 정상에 선 아래 추가

그런 다음 원하는대로 각 작업 위에 속성 경로를 추가하십시오. (이 경우 홈 컨트롤러의 동작)
예 : 코드 샘플 http://site/Home/About에서 "/ 홈"을 제거하고 http://site/About

[Route("About")] 
public ActionResult About() 
{ 

솔루션 (경로 제약 조건을 사용하여) 02 [Source]에서 사용할 수 아래

은 다음과 RouteConfig에 새 경로 매핑을 추가합니다. (기본 (일반) 경로 전에 이러한 특정 경로를 추가해야합니다.

routes.MapRoute(
    "Root", 
    "{action}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new { isMethodInHomeController = new RootRouteConstraint<HomeController>() } 
); 

을이 홈 컨트롤러 RootRouteConstraint 클래스

public class RootRouteConstraint<T> : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower()); 
     return rootMethodNames.Contains(values["action"].ToString().ToLower()); 
    } 
} 

의 모든 작업 (경로)에서 "홈"을 제거합니다 선택 사항 정보 :이 행 (제약)은 HomeController에만이 라우팅을 적용합니다.

new { isMethodInHomeController = new RootRouteConstraint<HomeController> 
1

이 같은 defult 경로하기 전에 사용자 정의 경로를 추가 할 수 있습니다

routes.MapRoute(
     "OnlyAction", 
     "{action}", 
     new { controller = "Home", action = "Index" } 
    ); 

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    );