加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 如何使用MVC中的存储库模式创建动态的多个部分

发布时间:2020-12-16 07:40:31 所属栏目:asp.Net 来源:网络整理
导读:我试图有一个通用的主页,根据传递给控件的参数,将显示不同的内容(模块). 例如,用户可以从菜单中选择肯塔基州,肯塔基州的ID是1.家庭控制器获取id(1)并确定可能的模块 state(一个简单的数据库调用.)也许有一个公告模块和一个状态的联系人模块.公告模块可能有几
我试图有一个通用的主页,根据传递给控件的参数,将显示不同的内容(模块).

例如,用户可以从菜单中选择肯塔基州,肯塔基州的ID是1.家庭控制器获取id(1)并确定可能的模块
state(一个简单的数据库调用.)也许有一个公告模块和一个状态的联系人模块.公告模块可能有几个项目,但它只有一个模块.每种类型的模块都会有部分视图.

这是我的基本设置.

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”文件夹中为每种模块类型创建部分视图. (在不创建它们的情况下运行它,它将向您显示一个异常,其中包含它正在寻找它们的位置).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读