2014-02-07 2 views
5

Webforms 사이트를 MVC로 마이그레이션 중입니다. 내 webforms 사이트에서 나는 여러 조합의 사용자 정의 컨트롤을 사용하는 페이지를 가지고 있으며 그 다음 html 태그, 텍스트 상자 등을 사용합니다.Asp.Net MVC에서 부분 뷰를 동적으로 삽입하는 방법

각 페이지를 고정 배선하고 싶지 않아 각 페이지의 출력을 구동 할 것입니다. 컨트롤을 페이지에 삽입하는 순서를 지정하는 CMS입니다.

각 컨트롤이 MVC의 부분 뷰일 것입니다. (그것이 정확하지 않은 경우 알려주십시오.)

ViewA와 ViewB의 두 가지 부분 뷰가있는 경우 주어진 URL에 대해 CMS가 결정한 순서대로 부분 뷰를 뷰에 삽입하는 컨트롤러 메서드를 어떻게 만듭니 까?

컨트롤러 메서드를 Reports라고 가정하고 product라는 매개 변수를 사용합니다.

예 // 내 사이트/고서 제품 = A는 ViewA, ViewA, ViewB, ViewA

포함 된 뷰를 리턴

// 내 사이트/보고서? 제품 = B가 ViewA 포함 된 뷰를 리턴 ViewB 반면 , ViewA, ViewB 등

그럼 컨트롤러 코드는 어떻게해야합니까?

는 내가 제대로이

그냥 그것들을 렌더링하기 위해 여러 뷰 이름을 받아 PartialViewResult에서 파생 된 새 클래스를 만드는 문제 해결해야 당신을 이해하면 그 의미

답변

4

하게되기를 바랍니다. 좀 더 유용하게 사용하려면 제어기가 사용자 정의 된 ViewResult를 호출하는 새로운 확장 메소드를 작성하십시오.

저에게 도움이되었습니다. 당신은 너무 간단하게 사용할 수 있습니다

public ActionResult Index() 
{ 
    return this.ArrayView(new string[] { "ViewA", "ViewB" }); 
} 

그것이 ArrayViewResult 클래스해야 작동하려면 :

public class ArrayViewResult : PartialViewResult 
{ 
    public IEnumerable<string> Views; 

    protected override ViewEngineResult FindView(ControllerContext context) 
    { 
     return base.FindView(context); 
    } 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 
     if (!Views.Any()) 
      throw new Exception("no view..."); 


     TextWriter writer = context.HttpContext.Response.Output; 

     foreach(var view in Views) 
     { 
      this.ViewName = view; 
      ViewEngineResult result = FindView(context); 

      ViewContext viewContext = new ViewContext(context, result.View, ViewData, TempData, writer); 
      result.View.Render(viewContext, writer); 

      result.ViewEngine.ReleaseView(context, result.View); 
     } 
    } 
} 

확장 방법 :

namespace System.Web.Mvc 
{ 
    public static class ArrayViewResultExtension 
    { 
     public static ArrayViewResult ArrayView(this Controller controller, string[] views) 
     { 
      return ArrayView(controller, views, null); 
     } 
     public static ArrayViewResult ArrayView(this Controller controller, string[] views, object model) 
     { 
      if (model != null) 
      { 
       controller.ViewData.Model = model; 
      } 

      return new ArrayViewResult 
      { 
       ViewName = "", 
       ViewData = controller.ViewData, 
       TempData = controller.TempData, 
       ViewEngineCollection = controller.ViewEngineCollection, 
       Views = views 
      }; 
     } 
    } 
} 
+0

최고 사람 일 마즈 - 완벽하게 작동합니다! –

관련 문제