2014-02-07 38 views
5

我正在將Webforms站點遷移到MVC。在我的webforms站點,我有頁面,利用用戶控件的各種組合,然後html,然後標籤,文本框塊等如何在Asp.Net MVC中動態插入部分視圖

我不想硬連線每頁,所以我要驅動輸出每頁一個CMS,指定將控件插入頁面的順序。

我想每個控件現在都是MVC中的部分視圖。 (讓我知道如果這是不正確的)。

因此,如果我有兩個不同的局部視圖ViewA和ViewB,我該如何創建一個控制器方法,將部分視圖插入到由CMS爲給定url確定的順序返回的視圖中?

因此,假設控制器方法被稱爲Reports,並且它需要一個名爲product的參數。

例如//的MySite /報告?產品= A返回包含ViewA,ViewA,ViewB,ViewA

視圖

//的MySite /報告?產品= B返回包含ViewA的圖,ViewB ,ViewA,ViewB等

那麼控制器的方法應該是什麼?

我希望是有道理的

回答

4

如果我的理解是否正確這應該解決您的問題

剛剛創建PartialViewResult其接受多個視圖名稱,使它們派生新類。爲了讓它更易於使用,請爲控制器創建一個新的擴展方法,以調用您的自定義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

頂人馬茲 - 完美的作品! –