[c#] 컨트롤러별로 다른 컨트롤러의 부분보기를 반환하는 방법은 무엇입니까?
나는이 XXX.cshtml
A의 파일 Views\ABC
폴더에 있습니다. 컨트롤러는ABC
또한 DEF
컨트롤러에Partialview("XXX" , xyzmodel)
“보기를 찾을 수 없음”오류가 발생합니다.
다른 컨트롤러에서 해당 뷰 를 호출하는 방법
답변
일반적으로 뷰 는 데이터 요구 사항을 지원 하는 특정 일치 컨트롤러 에 속하거나 Views/Shared
컨트롤러간에 공유되는 경우 (따라서 이름) 뷰는 폴더에 속합니다 .
“답변”(권장되지 않음-아래 참조) :
다음 과 같이 전체 경로 (확장 포함)를 지정하여 다른 컨트롤러에서보기 / 부분보기를 참조 할 수 있습니다 .
return PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
또는 상대 경로 (확장자 없음), @Max Toro
return PartialView("../ABC/XXX", zyxmodel);
그러나 이것은 어쨌든 좋은 아이디어가 아닙니다.
* 참고 : 다음은 작동하는 유일한 두 가지 구문입니다 . 그렇지 ABC\\XXX
않거나 ABC/XXX
다른 변형은 모두 상대 경로이며 일치 항목을 찾지 못합니다.
더 나은 대안 :
Html.Renderpartial
대신 뷰에서 사용할 수 있지만 확장도 필요합니다.
Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", modeldata);
사용 @Html.Partial
인라인 면도기 구문 :
@Html.Partial("~/Views/ControllerName/ViewName.cshtml", modeldata)
../controller/view
확장자없이 구문을 사용할 수 있습니다 (다시 @Max Toro에 대한 크레딧).
@Html.Partial("../ControllerName/ViewName", modeldata)
참고 : 분명히 RenderPartial
Partial보다 약간 빠르지 만 중요하지 않습니다.
실제로 다른 컨트롤러를 호출하려면 다음을 사용하십시오.
@Html.Action("action", "controller", parameters)
권장 솔루션 : @ Html.Action
개인적으로 선호하는 것은 @Html.Action
다른 컨트롤러의 뷰를 상호 참조하는 것보다 각 컨트롤러가 자신의 뷰를 관리 할 수 있도록 허용하므로 사용하는 것입니다.
예를 들어 일반적으로 필요한 키 값 (다른 뷰와 마찬가지로) 만 전달합니다.
@Html.Action("XXX", "ABC", new {id = model.xyzId })
그러면 ABC.XXX
작업 이 실행되고 결과가 제자리에 렌더링됩니다. 이를 통해 뷰와 컨트롤러가 개별적으로 독립적으로 유지 될 수 있습니다 (즉, 재사용 가능).
2014 년 9 월 업데이트 :
@ Html.Action을 사용할 수 없지만 action
및 controller
이름을 기반으로 뷰 경로를 만들어야하는 상황에 처했습니다 . 이를 위해이 간단한 View
확장 메서드를 추가하여 UrlHelper
return이라고 말할 수 있습니다 PartialView(Url.View("actionName", "controllerName"), modelData)
.
public static class UrlHelperExtension
{
/// <summary>
/// Return a view path based on an action name and controller name
/// </summary>
/// <param name="url">Context for extension method</param>
/// <param name="action">Action name</param>
/// <param name="controller">Controller name</param>
/// <returns>A string in the form "~/views/{controller}/{action}.cshtml</returns>
public static string View(this UrlHelper url, string action, string controller)
{
return string.Format("~/Views/{1}/{0}.cshtml", action, controller);
}
}
답변
컨트롤은 다음 순서로보기를 검색합니다.
- 공유 폴더에서 첫 번째
- 그런 다음 현재 컨트롤러와 일치하는 폴더 (귀하의 경우 Views / DEF)
xxx.cshtml
해당 위치에 없는 것처럼 “보기를 찾을 수 없음”오류를 반환합니다.
솔루션 :보기의 전체 경로를 사용할 수 있습니다.
처럼
PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
답변
간단히 다음을 사용할 수 있습니다.
PartialView("../ABC/XXX")