asp.net-mvc-3 – 如何使用MVC中的存储库模式创建动态的多个部分
我试图有一个通用的主页,根据传递给控件的参数,将显示不同的内容(模块).
例如,用户可以从菜单中选择肯塔基州,肯塔基州的ID是1.家庭控制器获取id(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,它基本上就像“公告”,我可以创建一个announcements.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); } 这将是正确的局部视图并将其传递给正确的模型. 解决方法
创建派生自公共Module基类的Module类:
public class AnnouncementsModule : Module { } public class ContactsModule : Module { } 在控制器中: 创建各种模块并将它们放入整个视图模块(这里有一个名为Modules的属性,它是一个Module数组: var viewModel = new ComplexViewModel { Modules = new [] { new ContactsModule(),new AnnouncementsModule() } }; return View(viewModule); 在视图中: @Html.DisplayFor(x => x.Modules); 在相应的“Shared”文件夹中为每种模块类型创建部分视图. (在不创建它们的情况下运行它,它将向您显示一个异常,其中包含它正在寻找它们的位置). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Asp.Net Webforms Vs Asp.Net WebSite(Razor)Vs
- asp.net – 无法加载文件或程序集’Microsoft.Of
- asp.net-mvc – ASP.NET MVC 3 – 这个布尔值如何
- ASP.NET – ERR_EMPTY_RESPONSE /重置连接/无法显
- 如何在ASP.NET 2.0应用程序中为API调用启用TLS 1
- asp.net – SignalR(Hub)可以发送除信号制作者之
- ASP.NET Web窗体DropDownList具有SelectedValue,
- 从Azure功能调用Asp.Net Web API端点
- 提供第三种代码生成方式——通过自定义BuildProv
- Asp.Net MVC是企业项目的合适解决方案吗?