위치를 지정하는 방법 MVC 컨트롤러에 MVC 뷰가 생성되는 방법은 무엇입니까?
-
03-07-2019 - |
문제
중요한 업데이트
MVC 2.0 미리보기 릴리스 1 이후이 기능은 영역 형태로 실제 프레임 워크 자체의 일부로 구현되었습니다. 자세한 내용은 Phil Haack의 블로그에서 제공됩니다 여기
ListManagerController라는 컨트롤러가 있습니다. 이 컨트롤러에는 index ()라는 ActionResult 메소드가 포함되어 있습니다. Visual Studio에서 인덱스를 오른쪽으로 올바른 상태에서 Cick을 선택하고 추가보기보기 새보기가/views/listmanager/index가 작성됩니다.
그러나 나는 인덱스 뷰와 모든 후속 뷰가 /뷰에서 생성되기를 원합니다.관리하다/listmanager/. 이것을 어떻게 달성 할 것인가?
편집하다:이 질문은 게시 된 질문의 복제품이라고 지적했습니다. 여기. 내 검색 기술이 처음에는 실패한 것 같습니다.
다른 팁
나는 당신이 이미 답을 받아 들였다는 것을 알고 있지만 여기에 같은 아이디어를 실험하면서 내가 생각해 낸 것이 있습니다. 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에서 견해를 정리하십시오