Я пытаюсь создать общую домашнюю страницу, на которой в зависимости от параметра, переданного элементу управления, будет отображаться разное содержимое (модули).
Например, пользователь может выбрать Кентукки из меню, а идентификатор Кентукки равен 1. Домашний контроллер получает идентификатор (1) и определяет возможные модули для этого состояния (простой вызов БД). Возможно, есть модуль объявлений и модуль контактов для государства. Модуль объявлений может иметь несколько элементов, но это только один модуль. Будет частичное представление для каждого типа модуля.
Вот основные настройки, которые у меня есть.
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 ...
}
В моем домашнем контроллере...
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, который в основном будет чем-то вроде «Объявлений», и я могу просто создать частичный файл messages.ascx для обработки модуля. Но мне было трудно передать мой модуль меню и объект объявлений.
Я также возился с передачей более сложного объекта, а затем тестировал каждый 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> announcements { get; set; }
public IList<MenuItemModule> 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);
}
Что бы получить правильный частичный вид и передать ему правильную модель.
Html.DisplayFor(...)
? Он отобразит DisplayTemplate, соответствующий типу свойства. - person Ian Mercer   schedule 25.04.2013Type
объекта. - person Ian Mercer   schedule 25.04.2013