2014-01-24 2 views
3
다음과 같이

우리의 솔루션 계층 구조는 다음과 같습니다ASP.NET MVC 사용자 정의보기 라우팅

컨트롤러 \ 범주 \보기

예 : 컨트롤러 DataAnalysis \ DataRetrieve 지금

나는지도를하고 싶습니다 \를 사용자가 URL의 뷰 이름을 입력하면 자동으로 해당 컨트롤러에 URL을 매핑합니다.

IE : localhost : 1234 \ DataAnalysis \ DataRetrieve

마찬가지로, 조치를 포함한 모든 URL 요청이 해당 뷰를 검색해야

보기 \ DataAnalysis \ DataRetrieve \에

IE를 Index.cshtml을지도해야 : 로컬 호스트 : 1234 \ DataAnalysis \ DataRetrieve \

TestAction이

에 매핑해야

보기 \ DataAnalysis \ DataRetrieve \ TestAction.cshtml

현재, 우리는이 범주를 무시하고보기를 반환하지, 나는 URL 위에 표시된 입력하면 의미

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

라우팅 기본을 사용하고 있습니다.

위의 동작을 위해 라우팅을 사용자 정의 할 수있는 방법이 있습니까?

--edit

는 의견에 따라 내 질문에 명확히하기 위해, 여기에 내가 localhost를 호출하는 경우 이제 내 솔루션 탐색기

enter image description here

을의 스크린 샷이다 : 12,346/DataAnalysis/DataRetrieve를이해야 나를 색인으로 데려가. 이렇게 라우팅하면 문제가되지 않습니다.

 routes.MapRoute(
      name: "ExampleRouting", 
      url: "{category}/{controller}/{action}" 
     ); 

여기에 문제가 있습니다. 나는 또한이처럼 내 파일 구조를 정리하고 싶습니다 : 나는 dataretrieve의 인덱스를 검색 할 때 기본적으로

enter image description here

, 그것은 DataRetrieve \ 색인되지 조회수 \ 뷰에서 보이는 \ DataAnalysis \ DataRetrieve \ 색인.

이 동작을 어떻게 변경합니까?

Edit2가이 ------------------------

대답을 바탕으로, 내가 추가 한 사용자 지정보기의 엔진에 등록 Application_Start, 내 경로를 업데이트했습니다. 여전히 동일한 문제가 있습니다.

글로벌.에서보기 위치를 해결 asax

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     ViewEngines.Engines.Add(new SPCViewEngine()); 

     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AuthConfig.RegisterAuth(); 
    } 
} 

RouteConfig.cs

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 


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

SPCViewEngine (사용자 정의보기 엔진) 내가 제대로 질문을 이해하면

public class SPCViewEngine : RazorViewEngine 
{ 
    public SPCViewEngine() 
     : base() 
    { 
     ViewLocationFormats = new[] { 
      "~/Views/{1}/%1/{0}.cshtml", 
      "~/Views/{1}/%1/{0}.vbhtml", 
      "~/Views/Shared/{0}.cshtml", 
      "~/Views/Shared/{0}.vbhtml" 
     }; 

     PartialViewLocationFormats = new[] { 
      "~/Views/%1/{1}/{0}.cshtml", 
      "~/Views/%1/{1}/{0}.vbhtml", 
      "~/Views/Shared/{0}.cshtml", 
      "~/Views/Shared/{0}.vbhtml" 
     }; 
    } 

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     var categoryName = controllerContext.RouteData.Values["category"].ToString(); 
     return base.CreatePartialView(controllerContext, partialPath.Replace("%1", categoryName)); 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     var categoryName = controllerContext.RouteData.Values["category"].ToString(); 
     return base.CreateView(controllerContext, viewPath.Replace("%1", categoryName), masterPath); 
    } 

    protected override bool FileExists(ControllerContext controllerContext, string virtualPath) 
    { 
     var categoryName = controllerContext.RouteData.Values["category"].ToString(); 
     return base.FileExists(controllerContext, virtualPath.Replace("%1", categoryName)); 
    } 
} 
+0

그래서 DataAnalysis이 컨트롤러, 또는 프로젝트의 이름 및 DataRetrieve이 있다는 것이다 있어야한다 여기에 등록 제어 장치? – krillgar

+0

나는 혼란 스럽거나 어쩌면 당신입니다. 라우팅은보기와 관련이 없습니다. 라우팅은 컨트롤러 작업에만 연결됩니다. –

+1

지역을 사용하여 애플리케이션을 구성하는 것이 좋습니다. 이에 대해서는 http://msdn.microsoft.com/en-us/library/ee671793(v=vs.100).aspx를 참조하십시오. – Onots

답변

12

, 당신이 당신의 자신의보기 엔진을 만들 수 있습니다 런타임 및 응용 프로그램에 연결하십시오.

사용자 지정보기 엔진을 만듭니다.

public class MyViewEngine : RazorViewEngine 
{ 
    public MyViewEngine() 
     : base() 
    { 
     ViewLocationFormats = new[] { 
     "~/Views/{1}/%1/{0}.cshtml", 
     "~/Views/{1}/%1/{0}.vbhtml", 
     "~/Views/Shared/{0}.cshtml", 
     "~/Views/Shared/{0}.vbhtml" 
    }; 

    PartialViewLocationFormats = new[] { 
     "~/Views/%1/{1}/{0}.cshtml", 
     "~/Views/%1/{1}/{0}.vbhtml", 
     "~/Views/Shared/{0}.cshtml", 
     "~/Views/Shared/{0}.vbhtml" 
    }; 
    } 

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     var catagoryName = controllerContext.RouteData.Values["category"].ToString(); 
     return base.CreatePartialView(controllerContext, partialPath.Replace("%1", catagoryName)); 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     var catagoryName = controllerContext.RouteData.Values["category"].ToString(); 
     return base.CreateView(controllerContext, viewPath.Replace("%1", catagoryName),masterPath); 
    } 

    protected override bool FileExists(ControllerContext controllerContext, string virtualPath) 
    { 
     var catagoryName = controllerContext.RouteData.Values["category"].ToString(); 
     return base.FileExists(controllerContext, virtualPath.Replace("%1", catagoryName)); 
    } 

} 

그리고

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 


    //Register your View Engine Here. 
    ViewEngines.Engines.Add(new MyViewEngine()); 
} 

업데이트 경로 설정은 기본

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

답변이 올바른 방법 인 것 같지만 어떤 이유로 든 여전히 작동하지 않습니다. 사용자 정의 뷰 엔진의 localhost/DataAnalysis/DataRetrieve 결과에 404와 대체 메소드를 요청하면 디버그 포인트를 입력 할 때 호출됩니다. 그러나, 내가 localhost : 12346/DataRetrieve/TestAction 앞에 범주없이 시도하면 작동합니다. 편집 : 신경 쓰지 마세요, 후자의 부분도 작동하지 않습니다. – l46kok

+0

응용 프로그램 시작시보기 엔진을 등록 했습니까? 또한 경로 구성을 업데이트 했습니까? 내 localhost에서 내게 그것을 위해 노력 또한 디버그 포인트는 모든 요청에 ​​충돌해야합니다. – ssilas777

+0

예. 업데이트 된 콘텐츠로 잠시 질문을 수정하겠습니다. – l46kok