2014-02-07 17 views
5

Ich migrieren eine Webforms-Site zu MVC. In meiner Website Webforms habe ich Seiten, die verschiedene Kombinationen von Benutzersteuerelementen verwenden, dann Stücke von HTML dann Etiketten, Textboxen etc.So fügen Sie Teilansichten dynamisch in Asp.Net MVC

Ich möchte nicht jede Seite fest verdrahten, so werde ich die Ausgabe für jede Seite aus fahren ein CMS, das die Reihenfolge angibt, in der die Steuerelemente in die Seite eingefügt werden.

Ich stelle mir vor, jedes Steuerelement wird jetzt eine Teilansicht in MVC. (Lassen Sie mich wissen, wenn das nicht stimmt).

Also, wenn ich zwei verschiedene Teilansichten habe, ViewA und ViewB, wie erstelle ich eine Controller-Methode, die die Teilansichten in die Ansicht, die in der Reihenfolge vom CMS für eine bestimmte URL zurückgegeben wird, eingefügt?

Also angenommen, die Controller-Methode heißt Berichte und es dauert ein Parameter namens Produkt.

zB // MySite/Berichte? Product = A gibt eine Ansicht enthält ViewA, ViewA, ViewB, ViewA

während

// MySite/Berichte? Product = B eine Ansicht ViewA, ViewB kehrt enthaltend , ViewA, ViewB usw.

Also, was sollte der Code für die Controller-Methode sein?

Ich hoffe, das macht Sinn

Antwort

4

Wenn ich Sie richtig verstanden, das sollte Ihr Problem

einfach eine neue Klasse von PartialViewResult abgeleitet erstellen lösen, die mehrere Ansichtsnamen akzeptiert, sie zu machen. Und um es ein wenig nützlicher zu machen, erstellen Sie eine neue Erweiterungsmethode, damit der Controller Ihr benutzerdefiniertes ViewResult aufrufen kann.

Das hat bei mir funktioniert. Sie können es verwenden, so einfach:

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

Um es ArrayViewResult Klasse zu machen arbeiten sollte:

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

Erweiterungsmethode:

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

Top Mann Yilmaz - die perfekt funktioniert !! –

Verwandte Themen