다른 폴더에서 부분 렌더링 (공유되지 않음)


256

다른 폴더에서 부분 (사용자 정의 컨트롤)을 렌더링하도록 뷰를 만들려면 어떻게해야합니까? 미리보기 3에서는 완전한 경로로 RenderUserControl을 호출했지만 미리보기 5로 업그레이드하는 동안 더 이상 불가능합니다. 대신 RenderPartial 메서드를 얻었지만 원하는 기능을 제공하지 않습니다.

답변:


443

파일 확장자를 사용하여보기 경로를 포함하십시오.

면도칼:

@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)

ASP.NET 엔진 :

<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>

이것이 문제가 아닌 경우, RenderUserControl과 작동하는 데 사용 된 코드를 포함시킬 수 있습니까?


19
/ AnotherFolder / Messages
Simon_Weaver

4
@Simon_Weaver이를 달성 할 수 있습니다. 한 가지 방법은 ViewEngine을 수정 FindPartialView하고 다음과 같은 방법으로 메소드를 재정의하는 것입니다.if(partialViewName.Contains"/")partialViewName="~/Views/"+partialViewName;
Arnis Lapsa

2
MVC 3 Razor 엔진에서도 작동하지만 위와 같이 확장자 (.cshtml)가 필요합니다.
Chris

다른 경우에는 "~ / Areas / TestArea / Views / Shared / _SomePartial.mobile.cshtml"경로를 제공해야합니다.
sandeep talabathula

해당 부분 뷰의 다른 문화권을 어떻게 처리합니까 (예 : ~ / Views / AnotherFolder / Messages.en.cshtml)?
jasdefer

29

제 경우에는 MvcMailer (https://github.com/smsohan/MvcMailer)를 사용하고 "공유"에없는 다른 폴더에서 부분보기에 액세스하려고했습니다. 위의 해결책은 효과가 없었지만 상대 경로를 사용하는 것은 효과가 없었습니다.

@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)

마찬가지로 @ Html.Partial ( "../ Shared / _PartialView") 공유 폴더를 사용하십시오.
커티스 얄롭

11
끝에 .cshtml 확장자가 없으면 작동하지 않는 것으로 나타났습니다.
Luke

28

이 다른 경로를 많이 사용하는 경우 항상 경로를 지정하지 않고도 영구적으로 수정할 수 있습니다. 기본적으로 View 폴더와 Shared 폴더에서 부분보기를 확인합니다. 그러나 하나를 추가하고 싶다고 가정하십시오.

모델 폴더에 클래스를 추가하십시오.

public class NewViewEngine : RazorViewEngine {

   private static readonly string[] NEW_PARTIAL_VIEW_FORMATS = new[] {
      "~/Views/Foo/{0}.cshtml",
      "~/Views/Shared/Bar/{0}.cshtml"
   };

   public NewViewEngine() {
      // Keep existing locations in sync
      base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NEW_PARTIAL_VIEW_FORMATS).ToArray();
   }
}

그런 다음 Global.asax.cs 파일에서 다음 줄을 추가하십시오.

ViewEngines.Engines.Add(new NewViewEngine());

6
물론 나는이 질문이 오래 전에 요청되었다는 것을 알고 있습니다. 미래 Google 직원과 미래 Bingers를 위해 추가 할 것이라고 생각했습니다.
Paul

-RazorViewEngine.PartialViewLocationFormats가 없으므로 .Net Core 2.2에서 작동하지 않습니다.
Demian Berisford-Maynard 2016

7

Views / Account 폴더에있는 myPartial.ascx라는 사용자 정의 컨트롤의 경우 다음과 같이 작성하십시오.

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

5

나는 꽤 잘 작동하는 것처럼 보이는 해결 방법을 만들었습니다. 액션 이름 조회, 뷰 조회 등을 위해 다른 컨트롤러의 컨텍스트로 전환해야한다는 것을 알았습니다. 이것을 구현하기 위해 HtmlHelper다음과 같은 새로운 확장 방법을 만들었습니다 .

public static IDisposable ControllerContextRegion(
    this HtmlHelper html, 
    string controllerName)
{
    return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}

ControllerContextRegion 다음과 같이 정의됩니다.

internal class ControllerContextRegion : IDisposable
{
    private readonly RouteData routeData;
    private readonly string previousControllerName;

    public ControllerContextRegion(RouteData routeData, string controllerName)
    {
        this.routeData = routeData;
        this.previousControllerName = routeData.GetRequiredString("controller");
        this.SetControllerName(controllerName);
    }

    public void Dispose()
    {
        this.SetControllerName(this.previousControllerName);
    }

    private void SetControllerName(string controllerName)
    {
        this.routeData.Values["controller"] = controllerName;
    }
}

이것이 뷰 내에서 사용되는 방식은 다음과 같습니다.

@using (Html.ControllerContextRegion("Foo")) {
    // Html.Action, Html.Partial, etc. now looks things up as though
    // FooController was our controller.
}

코드에 controller경로 구성 요소가 변경되지 않아야 하는 경우 원하지 않는 부작용이있을 수 있지만 지금까지는이 방법에 부정적인 영향을 미치지 않는 것으로 보입니다.


4

WebFormsViewEngine의 기반이되는 VirtualPathProviderViewEngine은 경로 앞의 "~"및 "/"문자를 지원하므로 위의 예제가 작동해야합니다.

예제에서 "~ / Account / myPartial.ascx"경로를 사용하는 것을 보았지만 사용자 컨트롤이 Views / Account 폴더에 있다고 언급했습니다. 당신이 시도 했습니까

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

아니면 당신의 질문에 오타입니까?



0

당신은 이것을 시도해야

~/Views/Shared/parts/UMFview.ascx

~/Views/코드 앞에 배치


0

사용자 지정보기 엔진을 만들고 ViewEngineResult를 반환하는 메서드가 있습니다.이 예제에서는 덮어 쓰고 _options.ViewLocationFormats폴더 디렉토리를 추가합니다.

public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage)
        {
            var controllerName = context.GetNormalizedRouteValue(CONTROLLER_KEY);
            var areaName = context.GetNormalizedRouteValue(AREA_KEY);

            var checkedLocations = new List<string>();
            foreach (var location in _options.ViewLocationFormats)
            {
                var view = string.Format(location, viewName, controllerName);
                if (File.Exists(view))
                {
                    return ViewEngineResult.Found("Default", new View(view, _ViewRendering));
                }
                checkedLocations.Add(view);
            }

            return ViewEngineResult.NotFound(viewName, checkedLocations);
        }

예 : https://github.com/AspNetMonsters/pugzor


-5

사용해보십시오 RenderAction("myPartial","Account");


3
코드에서 폴더가있는 다른 폴더의보기에 대해 사용자가 묻는 질문을 읽으십시오.
Pamma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.