문제

중요한 업데이트
MVC 2.0 미리보기 릴리스 1 이후이 기능은 영역 형태로 실제 프레임 워크 자체의 일부로 구현되었습니다. 자세한 내용은 Phil Haack의 블로그에서 제공됩니다 여기

ListManagerController라는 컨트롤러가 있습니다. 이 컨트롤러에는 index ()라는 ActionResult 메소드가 포함되어 있습니다. Visual Studio에서 인덱스를 오른쪽으로 올바른 상태에서 Cick을 선택하고 추가보기보기 새보기가/views/listmanager/index가 작성됩니다.

그러나 나는 인덱스 뷰와 모든 후속 뷰가 /뷰에서 생성되기를 원합니다.관리하다/listmanager/. 이것을 어떻게 달성 할 것인가?

편집하다:이 질문은 게시 된 질문의 복제품이라고 지적했습니다. 여기. 내 검색 기술이 처음에는 실패한 것 같습니다.

도움이 되었습니까?

해결책

보기의 위치는 사용중인 관점과 관련이 있습니다. AFAIK 웹 양식보기 엔진은 영역을 지원하지 않습니다 [예에서 관리].

불꽃 이것을 지원하고 매우 깨끗합니다. 웹 양식과 스파크 뷰를 믹싱하고 일치시킬 수 있으므로 모든보기를 재현 할 필요가 없습니다.

업데이트: Phil Haack이있는 것 같습니다 블로그 게시물 이것을 달성하는 방법에. 그의 코드는 RC를위한 것이지만 ASP.NET MVC RTM에 대해 잘 컴파일해야한다고 생각합니다.

다른 팁

나는 당신이 이미 답을 받아 들였다는 것을 알고 있지만 여기에 같은 아이디어를 실험하면서 내가 생각해 낸 것이 있습니다. Phil Haack의 게시물.

먼저 View 폴더 아래에서 폴더를 찾으려면 자신의 ViewEngine이 있어야합니다. 다음과 같은 것 : (Phil Haack의 영역 코드와 비슷해 보일 것입니다)

public class TestViewEngine : WebFormViewEngine
{
    public TestViewEngine()
        : base()
    {
        MasterLocationFormats = new[] {
            "~/Views/{1}/{0}.master",
            "~/Views/Shared/{0}.master"
        };

        ViewLocationFormats = new[] {
            "~/{0}.aspx",
            "~/{0}.ascx",
            "~/Views/{1}/{0}.aspx",
            "~/Views/{1}/{0}.ascx",
            "~/Views/Shared/{0}.aspx",
            "~/Views/Shared/{0}.ascx"
        };

        PartialViewLocationFormats = ViewLocationFormats;
    }
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        ViewEngineResult rootResult = null;

        //if the route data has a root value defined when mapping routes in global.asax
        if (controllerContext.RouteData.Values.ContainsKey("root")) {
            //then try to find the view in the folder name defined in that route
            string rootViewName = FormatViewName(controllerContext, viewName);
            rootResult = base.FindView(controllerContext, rootViewName, masterName, useCache);
            if (rootResult != null && rootResult.View != null) {
                return rootResult;
            }
            //same if it's a shared view
            string sharedRootViewName = FormatSharedViewName(controllerContext, viewName);
            rootResult = base.FindView(controllerContext, sharedRootViewName, masterName, useCache);
            if (rootResult != null && rootResult.View != null) {
                return rootResult;
            }
        }
        //if not let the base handle it
        return base.FindView(controllerContext, viewName, masterName, useCache);
    }

    private static string FormatViewName(ControllerContext controllerContext, string viewName) {
        string controllerName = controllerContext.RouteData.GetRequiredString("controller");

        string root = controllerContext.RouteData.Values["root"].ToString();
        return "Views/" + root + "/" + controllerName + "/" + viewName;
    }

    private static string FormatSharedViewName(ControllerContext controllerContext, string viewName) {
        string root = controllerContext.RouteData.Values["root"].ToString();
        return "Views/" + root + "/Shared/" + viewName;
    }
}

그럼 당신의 Global.asax 기본 뷰 엔진을 사용자 정의로 바꾸십시오. Application_Start :

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestViewEngine());

이제 경로를 정의 할 때 Global.asax, 당신은 a를 설정해야합니다 root 폴더를 나타내는 값은 다음과 같은 뷰 폴더 아래에서 찾을 수 있습니다.

routes.MapRoute(
    "ListManager",
    "ListManager/{action}/{id}",
    new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
 );

이 질문은 매우 반복적입니다 이 질문

그래서 여기에 그 대답을 인용하겠습니다.

나는 내 시야 엔진을 굴릴 필요가없는 다른 솔루션을 생각해 냈습니다.

기본적으로 MVC를 가능한 한 "컨벤션"으로 유지하고 싶었지만 여전히 ~/뷰/관리자 폴더 아래의 모든 "관리자"뷰를 구성하고 싶었습니다.

예시:

  • ~/views/admin/user/
  • ~/뷰/admin/News/
  • ~/보기/관리자/블로그/

내 솔루션은 특정 관리자 컨트롤러를위한 새 기본 클래스를 만들고 해당 컨트롤러의 뷰로 경로를 "강제"하는 것이 었습니다.

여기에는 블로그 게시물과 샘플 코드가 있습니다. ASP.NET MVC에서 견해를 정리하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top