So erstellen Sie dynamische, mehrere Teilansichten mithilfe des Repository-Musters in MVC

Ich versuche, eine allgemeine Homepage zu haben, auf der je nach dem an das Steuerelement übergebenen Parameter unterschiedliche Inhalte (Module) angezeigt werden.

Zum Beispiel kann ein Benutzer Kentucky aus dem Menü auswählen und die ID für Kentucky ist 1. Der Heim-Controller erhält die ID (1) und bestimmt die möglichen Module für diesen Zustand (ein einfacher DB-Aufruf). Möglicherweise gibt es ein Ankündigungsmodul und ein Kontaktmodul für den Staat. Ein Ankündigungsmodul kann mehrere Elemente enthalten, es ist jedoch nur ein Modul. Für jeden Modultyp gibt es eine Teilansicht.

Hier ist die Grundeinstellung, die ich habe.

public interface IModuleRepository
{
    IList<MenuItemModule> GetMenuItemModules(int menuItem);
    IList<Announcements> GetAnnouncements(int modID);
    IList<News> GetNews(int modID);
    IList<Contacts> GetContacts(int modID);
}



//business object
public class MenuItemModule
{

    private int _MenuItemID;
    private int _ModuleID;
    private int _ModuleDefID;
    private string _Src;
    private int _ModuleOrder;

//get, set properties for these...

}

//announcements entity
public class Announcements
{
    private int _ID = -1;
    private int _MenuItemID = -1;
    private int _ModuleID = -1;
    private string _Description = string.Empty;

//get set props ...
}

In meinem Heim-Controller ...

public class HomeController : Controller
{


    private IModuleRepository modRepository;

    public HomeController(IModuleRepository modRepository)
    {
        this.modRepository = modRepository;
    }


    public ViewResult Item(string ItemID)
    {

        //returns a list of menuitemmodules for the page.  This gives me the Src or name of each
        //module on the page, i.e. Announcements, news, contacts, etc. 
        var modules = modRepository.GetMenuItemModules(Convert.ToInt32(ItemID)); 


        return View(modules);

   }

}

Ich habe verschiedene Modelle ausprobiert, um zurückzukehren, aber ich bin immer auf eine Einschränkung gestoßen. Wenn ich die Menümodule an meine Item.aspx übergebe, kann ich so etwas tun:

   foreach (var mod in Model)           
   {               
        Html.RenderPartial(mod.Src, a);      //needs an announcement object though    
   } 

Das macht es etwas dynamisch, weil ich den Src habe, der im Grunde genommen so etwas wie "Announcements" wäre und ich kann einfach eine announcements.ascx partiell erstellen, um das Modul zu verarbeiten. Aber ich habe es schwierig gefunden, mein Menümodul und eine Ansageeinheit ebenfalls zu bestehen.

Ich habe auch damit herumgespielt, ein komplexeres Objekt zu übergeben und dann jeden Src zu testen, der mit einer If-Anweisung durchkommt. Dies würde zukünftig die Skalierung erschweren, da ich die Anzahl der möglichen Module in der App erhöhe.

Wie kann ich mein Problem lösen? Ich hoffe, ich habe genug Informationen zur Verfügung gestellt. Ich mag die Grundidee hier -http://www.mikesdotnetting.com/Article/105/ASP.NET-MVC-Partial-Views-and-Strongly-Typed-Custom-ViewModels Dies scheint jedoch nur für statische Module auf einer Seite zu funktionieren.

Ich habe ein zusammengesetztes Ansichtsmodell namens ModuleViewModel ausprobiert. Hier ist dieser Versuch:

public class ModuleViewModel
{
    public IList<Announcements> announcements { get; set; }
    public IList<MenuItemModule> mods { get; set; }

}

Wenn ich dieses Modell an Item.aspx weitergebe, kann ich so etwas tun (aber ich muss etwas falsch machen, weil etwas nicht richtig aussieht.)

   foreach (var mod in Model)           
   {

       if (mod.announcements.Count > 0)
       {
           Html.RenderPartial("Announcements", mod.announcements);
       }


   } 

Wieder einmal wird mich die Skalierbarkeit heimsuchen. Ich möchte so etwas auf der Artikelseite haben:

   foreach (var mod in Model)           
   {

           Html.RenderPartial(mod.Src, mod);          

   } 

Das wäre die richtige Teilansicht und würde ihr das richtige Modell übergeben.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage