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




asp.net mvc 부분뷰 (7)

이 다른 경로를 많이 사용하는 경우 항상 경로를 지정하지 않고도이 문제를 영구적으로 해결할 수 있습니다. 기본적으로 View 폴더와 Shared 폴더에서 부분 뷰를 확인합니다. 하지만 하나 추가하길 원합니다.

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

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());

뷰를 다른 폴더에서 부분 렌더링 (사용자 정의 컨트롤) 할 수 있습니까? 미리보기 3에서는 RenderUserControl을 전체 경로로 호출했지만 이전에 미리보기 5로 업그레이드하면 더 이상 가능하지 않습니다. 대신 RenderPartial 메서드가 있지만 원하는 기능을 제공하지 않습니다.


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


너는 이걸 시도해야 해.

~/Views/Shared/parts/UMFview.ascx

코드 앞에 ~/Views/ 를 배치하십시오.


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

귀하의 예제에서 "~ / Account / myPartial.ascx"경로를 사용하는 것으로 나타 났지만 사용자 정의 컨트롤이 Views / Account 폴더에 있다고 언급했습니다. 시도해 봤어?

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

또는 귀하의 질문에 오타가 있습니까?


제 경우에는 MvcMailer (https://github.com/smsohan/MvcMailer)를 사용하고 있었고 "공유"에없는 다른 폴더에서 부분보기에 액세스하려고했습니다. 위의 솔루션은 작동하지 않았지만 상대 경로를 사용했습니다.

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

파일 확장명과 함께보기의 경로 만 포함하면됩니다.

면도칼:

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

ASP.NET 엔진 :

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

그게 문제가 아니라면, RenderUserControl에서 사용했던 코드를 포함시켜 주시겠습니까?


나는 꽤 잘 작동하는 해결 방법을 만들었습니다. 액션 이름 조회, 조회 조회 등을 위해 다른 컨트롤러의 컨텍스트로 전환 할 필요가 있음을 발견했습니다.이를 구현하기 위해 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 라우트 구성 요소가 변경되지 않아야하는 경우 원하지 않는 부작용이있을 수 있지만 지금까지는이 코드에서이 방법에 대한 부정적인면이없는 것으로 보입니다.





renderpartial