Как создать динамические, множественные частичные представления, используя шаблон репозитория в MVC
Я пытаюсь создать общую домашнюю страницу, на которой в зависимости от параметра, передаваемого элементу управления, будет отображаться различный контент (модули).
Например, пользователь может выбрать Кентукки из меню, а идентификатор для Кентукки равен 1. Контроллер дома получает идентификатор (1) и определяет возможные модули для этого состояния (простой вызов БД.) Возможно, есть модуль объявлений и модуль контактов для гос. Модуль объявлений может содержать несколько элементов, ноТолько один модуль. Там будет частичное представление для каждого типа модуля.
Вот основные настройки, которые у меня есть.
public interface IModuleRepository
{
IList GetMenuItemModules(int menuItem);
IList GetAnnouncements(int modID);
IList GetNews(int modID);
IList 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 ...
}
В моем домашнем контроллере ...
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);
}
}
Я пробовал несколько разных моделей, чтобы вернуться, но я всегда сталкиваюсь с некоторыми противоречиями. Если я передаю menuitemmodules в мой Item.aspx, то я могу сделать что-то вроде этого:
foreach (var mod in Model)
{
Html.RenderPartial(mod.Src, a); //needs an announcement object though
}
Это делает его несколько динамичным, потому что у меня есть Src, который в основном был бы чем-то вродеОбъявления» и я могу просто создать частичную анонсы для обработки модуля. Но мне было трудно передать мой модуль меню и объект объявлений.
Я также возился с передачей более сложного объекта, а затем тестировал каждый Src, который проходит с помощью оператора If. Это усложнит масштабирование в будущем, так как я увеличу количество возможных модулей в приложении.
Как я могу решить мою проблему? Я надеюсь, что предоставил достаточно информации. Мне нравится основная идея здесь -http://www.mikesdotnetting.com/Article/105/ASP.NET-MVC-Partial-Views-and-Strongly-Typed-Custom-ViewModels но это, кажется, работает только для статических модулей на странице.
Я попробовал модель составного представления под названием ModuleViewModel. Вот эта попытка:
public class ModuleViewModel
{
public IList announcements { get; set; }
public IList mods { get; set; }
}
Если я передам эту модель в Item.aspx, я могу сделать что-то вроде этого (но я должен делать что-то не так, потому что что-то не такне выглядишь правильно.)
foreach (var mod in Model)
{
if (mod.announcements.Count > 0)
{
Html.RenderPartial("Announcements", mod.announcements);
}
}
Еще раз, масштабируемость будет преследовать меня. Я хотел бы иметь что-то вроде этого на странице товара:
foreach (var mod in Model)
{
Html.RenderPartial(mod.Src, mod);
}
Это будет правильный частичный вид и передать ему правильную модель.