ASP.NET MVC의 다른 컨트롤러에서보기 표시


248

다른 컨트롤러에서보기를 표시 할 수 있습니까?

말은 예를 들어 내가 가지고 CategoriesControllerCategory/NotFound.aspx보기를. 에있는 동안 CategoriesController, 나는 쉽게 돌아올 수 있습니다 View("NotFound").

이제 ProductsController제품을 추가하기위한 조치 및보기 가 있다고 가정하겠습니다 . 그러나이 작업을 수행하려면 제품을 추가 할 카테고리가 있어야합니다. 예를 들면 다음과 같습니다 Products/Add/?catid=10.

에 따라 카테고리를 찾을 수없는 경우 Products 컨트롤러 에서 보기 를 작성하는 대신 Categories 컨트롤러에서보기 catid를 표시하려고합니다 .NotFoundCategoryNotFound

이것이 가능합니까 아니면 내가 잘못된 방식으로 물건을 구조화하고 있습니까? 이를 수행하는 좋은 방법이 있습니까?

답변:


283

예. 기본적으로 ASP.NET MVC는에서 먼저 체크인 \Views\[Controller_Dir]\하지만 그 후에보기를 찾지 못하면에서 체크인합니다 \Views\Shared.

공유 디렉토리는 특히 여러 컨트롤러에서보기를 공유하기 위해 존재합니다. 공유 서브 디렉토리에보기를 추가하기 만하면됩니다.

당신이 return View("~/Views/Wherever/SomeDir/MyView.aspx")원하는 경우 당신은 당신이 원하는보기를 반환 할 수 있습니다.


감사합니다. 이것은 내가 사용해야하는 솔루션처럼 들립니다. 그래도 다른 컨트롤러에서보기를 표시 할 수 있는지 궁금합니다. 이것이 MVC의 규칙을 위반한다고 생각합니까?
dtc

1
위에서 설명한 상황에서는 예, 공유 폴더를 사용해야합니다.
Jonathan Freeland

69
그래도 가능하다. View ( "~ / Views / Wherever / SomeDir / MyView.aspx")를 반환하면 원하는 모든 View를 반환 할 수 있습니다. ASP.Net MVC는 "컨벤션 오버 컨벤션"에 관한 것입니다. 즉, 프레임 워크는 특정 규칙을 사용하여 자동으로 작동하도록 만들어졌으며 가능한 경우이를 사용해야합니다.
womp

1
설명해 주셔서 감사합니다. 뷰가 그렇게 호출 될 수 있는지 몰랐습니다. 공유 디렉토리는 물론 완벽하게 작동합니다 :)
dtc

1
나는 컨트롤러에 없었기 때문에 사용해야 new ViewResult { ViewName = "~/Views/Error/Unauthorised.cshtml" };했고 작동했습니다.
Nacht-Reinstate Monica

162

당신이 사용할 수있는:

return View("../Category/NotFound", model);

ASP.NET MVC 3에서 테스트되었지만 ASP.NET MVC 2에서도 작동합니다.


3
MVC 2에서 작동하며, 내가 다루고있는 비정상적인 상황에서 가장 깨끗한 솔루션으로 판명되었습니다.
Todd Menier

3
Resharper는 해당 링크를 오류로보고하지만 여전히 작동합니다.
CodeMonkeyKing 2019

1
@CodeMonkeyKing-Resharper 7 (VS2012)은 형식이 지정된 경로를 올바르게 식별합니다 "~/Views/Category/NotFound.cshtml".
Richard Ev

주목할만한 점 :이 솔루션은 디스플레이 모드에서 작동합니다 (예 : "/Category/NotFound.Mobile.cshtml"보기가있는 경우).
BenWillkommen

55

네 가능합니다. 다음 RedirectToAction()과 같은 메소드를 리턴 하십시오.

return RedirectToAction("ActionOrViewName", "ControllerName");

1
그렇지 않으면 두 번째 매개 변수는 routeValues
Zoran P.

그러나이 경우 View 솔루션과 달리 실제로 컨트롤러에 작업을 작성해야합니다.
tobbenb3

@ tobbenb3 결과를 하드 코딩하는 것이 아니라 훨씬 더 나은 솔루션입니다. 어느 쪽이든 경로 문자열을 전달해서는 안됩니다.
perustaja

34

시도 했습니까 RedirectToAction?


1
공유 폴더에서보기를 원하지 않는 사람에게는 이것이 MVC라고 말하고 싶습니다. 직접 경로 사용과 같은 다른 모든 솔루션의 경우보기를 다시 고려하려고하는 사람은 염두에 둘 필요가 없습니다. 또한, 예기치 않은 동작의 결과로, 다른 컨트롤러에서 사용되고 있음
요엘 halb

4
리디렉션하지 않고는 어떻습니까?
Luckyy

보기를 공유 폴더로 옮기는 것보다 더 나은 솔루션
juFo

이 솔루션에는 컨트롤러에 대한 조치가 필요합니다. View (directPath)는 조치없이 출력을 렌더링합니다. 액션을 추가 할 때 URL을 통한 직접 액세스에서 숨기려면 브라우저 히스토리 등에서 단계를 생성해야합니다. 그러나 그렇습니다.
Jan Zahradník

3
RedirectToAction은 브라우저에 302 응답 코드를 보냅니다. 404 찾을 수 없음 페이지를 표시하려고 할 때는 적합하지 않습니다. 즉,이 솔루션은 작동하는 것처럼 보이지만 검색 엔진을 혼란스럽게합니다.
NightOwl888

20

그래 넌 할수있어. 다음과 같은 조치를 리턴하십시오.

return RedirectToAction("View", "Name of Controller");

예를 들면 :

return RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");

이 접근법은 GET 메소드를 호출합니다

또한 다음과 같이 값을 조치에 전달할 수 있습니다.

return RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" });

이 방법으로 객체를 보내려면 어떻게해야합니까?
Djeroen

보고 @Djeroen를 타고
chiazzo 이그나시오

5
보기를 리턴하지 않고 조치를 호출 중입니다.
0014

무엇보다도 저에게 도움이되었습니다.
anil shrestha

5

JavaScript / jQuery 에서 모든 컨트롤러를 호출 할 수도 있습니다 . 404 또는 다른 usercontrol / page를 리턴하는 컨트롤러가 있다고 가정하십시오. 그런 다음 클라이언트 코드에서 어떤 조치를 취하면 컨트롤러를 시작하고 HTML 형식으로 결과를 반환하는 주소를 호출 할 수 있습니다. 클라이언트 코드는이 반환 결과를 가져 와서 페이지의 원하는 위치에 넣을 수 있습니다 ...


난 몰랐어. 나중에 사용할 수도있는 것 같습니다. 예, mvc rock :)
dtc

1

이 코드를 사용하면 모든 컨트롤러를 얻을 수 있습니다.

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, 
controller);

번역 : 당신이 어떤 컨트롤러를 얻을 수있는이 코드 : [코드], 감사합니다,
로버트 컬럼비아

3
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Nic3500
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.