[c#] 컨트롤러별로 다른 컨트롤러의 부분보기를 반환하는 방법은 무엇입니까?

나는이 XXX.cshtmlA의 파일 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)

참고 : 분명히 RenderPartialPartial보다 약간 빠르지 만 중요하지 않습니다.

실제로 다른 컨트롤러를 호출하려면 다음을 사용하십시오.

@Html.Action("action", "controller", parameters)

권장 솔루션 : @ Html.Action

개인적으로 선호하는 것은 @Html.Action다른 컨트롤러의 뷰를 상호 참조하는 것보다 각 컨트롤러가 자신의 뷰를 관리 할 수 ​​있도록 허용하므로 사용하는 것입니다.

예를 들어 일반적으로 필요한 키 값 (다른 뷰와 마찬가지로) 만 전달합니다.

@Html.Action("XXX", "ABC", new {id = model.xyzId })

그러면 ABC.XXX작업 이 실행되고 결과가 제자리에 렌더링됩니다. 이를 통해 뷰와 컨트롤러가 개별적으로 독립적으로 유지 될 수 있습니다 (즉, 재사용 가능).

2014 년 9 월 업데이트 :

@ Html.Action을 사용할 수 없지만 actioncontroller이름을 기반으로 뷰 경로를 만들어야하는 상황에 처했습니다 . 이를 위해이 간단한 View확장 메서드를 추가하여 UrlHelperreturn이라고 말할 수 있습니다 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")


답변