我试图有一个通用主页,根据传递给控件的参数,将显示不同的内容(模块)。
例如,用户可以从菜单中选择 Kentucky,Kentucky 的 id 为 1。家庭控制器获取 id (1) 并确定该状态的可能模块(一个简单的 db 调用)。也许有一个公告模块和状态的联系人模块。一个公告模块可以有多个项目,但它只有一个模块。每种类型的模块都会有一个局部视图。
这是我的基本设置。
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,它基本上类似于“公告”,我可以创建一个公告.ascx 部分来处理模块。但是我发现传递我的 menuitemmodule 和通知实体也很困难。
我还搞砸了传递一个更复杂的对象,然后测试每个带有 If 语句的 Src。随着我增加应用程序中可能模块的数量,这将使未来的扩展变得困难。
我该如何解决我的问题?我希望我提供了足够的信息。我喜欢这里的基本想法 - 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);
}
那将是正确的局部视图并将其传递给正确的模型。