2011-09-13 1 views
1

기존 웹 양식보기를 사용하는 이전 ASP.NET MVC 응용 프로그램이 있습니다. 실험으로 몇 가지 면도보기에서 혼합하기 시작했습니다. 불행하게도 원하는 뷰를 찾을 수있는 곳의 기본 우선 순위는 내가 원하는 것이 아닙니다. MVC는 먼저/Views/ControllerName 폴더에서 aspx 및 ascx 파일을 찾습니다. 그런 다음 aspx 및 ascx 파일의/Views/Shared로 이동합니다. 그런 다음 .cshtml 및 .vbhtml 파일을 찾습니다. 내가 원하는 것은/Views/ControllerName 폴더의 모든 가능성을 모두 다 써버를 때까지 Shared 폴더에 들어 가지 않기 위해서입니다. 어떻게해야합니까?뷰/공유 폴더에서 마지막으로 면도기 및 웹 양식보기 용 MVC를 어떻게 만들 수 있습니까?

--- UPDATE ---

여기 난 후 무엇을 설명하는 데 도움이 될 몇 가지 추가 정보입니다.

~/Views/Home/Index.aspx 
~/Views/Home/Index.ascx 
~/Views/Shared/Index.aspx 
~/Views/Shared/Index.ascx 
~/Views/Home/Index.cshtml 
~/Views/Home/Index.vbhtml 
~/Views/Shared/Index.cshtml 
~/Views/Shared/Index.vbhtml 

내가 원하는 것은 이것이다 : 기본적으로,이 검색 순서를 얻을이 완전히/뷰/컨트롤러 명 폴더를 검색하기 전에 즉

~/Views/Home/Index.aspx 
~/Views/Home/Index.ascx 
~/Views/Home/Index.cshtml 
~/Views/Home/Index.vbhtml 
~/Views/Shared/Index.aspx 
~/Views/Shared/Index.ascx 
~/Views/Shared/Index.cshtml 
~/Views/Shared/Index.vbhtml 

를, 그것은 공유 검색해서는 안된다.

답변

0

파일 당신의 global.asax.cs에서보기 엔진의 우선 순위를 구성 할 수 있습니다, 나는 간단한 유창함 API로 원하는 것을 달성 할 수 있었다. 확장 메서드는 각각의 뷰 엔진에서 원하지 않는 검색 위치를 제거합니다. 검색 위치는 .ViewLocationFormats.PartialViewLocationFormats 문자열 배열에 저장됩니다. 그래서 여기 배열에서 불필요한 항목을 제거 유창 API의 : 다음

public static class BuildManagerViewEngineFluentExtensions { 
    public static BuildManagerViewEngine ControllerViews(this BuildManagerViewEngine engine) { 
     return FilterViewLocations(engine, x => x.Contains("/Views/Shared/") == false); 
    } 

    public static BuildManagerViewEngine SharedViews(this BuildManagerViewEngine engine) { 
     return FilterViewLocations(engine, x => x.Contains("/Views/Shared/") == true); 
    } 

    private static BuildManagerViewEngine FilterViewLocations(BuildManagerViewEngine engine, Func<string, bool> whereClause) { 
     engine.ViewLocationFormats = engine.ViewLocationFormats.Where(whereClause).ToArray(); 
     engine.PartialViewLocationFormats = engine.PartialViewLocationFormats.Where(whereClause).ToArray(); 
     return engine; 
    } 
} 

그리고, 내를 Global.asax에, 나는 protected void Application_Start() 단지 문제를 반전

ViewEngines.Engines.Clear(); 
ViewEngines.Engines.Add(new RazorViewEngine().ControllerViews()); 
ViewEngines.Engines.Add(new WebFormViewEngine().ControllerViews()); 
ViewEngines.Engines.Add(new RazorViewEngine().SharedViews()); 
ViewEngines.Engines.Add(new WebFormViewEngine().SharedViews()); 
3

당신은 그것으로 조금 놀겠 후

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

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

     ViewEngines.Engines.Clear(); 
     ViewEngines.Engines.Add(new RazorViewEngine()); 
     ViewEngines.Engines.Add(new WebFormViewEngine()); 
    } 
+0

에 다음 줄을 추가했다. 먼저 .aspx/.ascx에서 .cshtml/.vbhtml로 순서를 변경합니다. 그러나 그것은/Views/ControllerName 폴더의 모든 가능성을 다 써 버리기 전에 여전히 Shared 폴더를보고 있으므로 찾고자하는 것이 아닙니다. – mattmc3

+0

@ mattmc3 당신이 얻은 것을 얻기 위해서, 당신은'RazorViewEngine'과'WebFormViewEngine'의 프록시 인 새로운 View Engine을 작성해야 할 것입니다. – Eranga

관련 문제