5

Tôi đang cố gắng để có một trang chủ chung tùy thuộc vào tham số được truyền cho điều khiển, nội dung khác nhau (mô-đun) sẽ được hiển thị. Ví dụ: người dùng có thể chọn Kentucky từ trình đơn và id cho Kentucky là 1. Bộ điều khiển chính nhận id (1) và xác định các mô-đun có thể cho trạng thái (một cuộc gọi db đơn giản.) Có lẽ có là mô-đun thông báo và mô-đun danh bạ cho tiểu bang. Một mô-đun thông báo có thể có nhiều mục nhưng chỉ có một mô-đun. Sẽ có một chế độ xem từng phần cho từng loại mô-đun.Cách tạo các chế độ xem động, nhiều phần bằng cách sử dụng mẫu lưu trữ trong MVC

Đây là thiết lập cơ bản tôi có.

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 ... 
} 

Trong điều khiển nhà tôi ...

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); 

    } 

} 

Tôi đã thử mô hình khác nhau để trở lại nhưng tôi luôn luôn chạy lên chống lại một số contstraint. Nếu tôi vượt qua menuitemmodules để Item.aspx tôi, sau đó tôi có thể làm một cái gì đó như thế này:

foreach (var mod in Model)   
    {    
     Html.RenderPartial(mod.Src, a);  //needs an announcement object though  
    } 

Điều đó làm cho nó một chút năng động bởi vì tôi có Src mà về cơ bản sẽ là một cái gì đó như "Thông báo" và tôi chỉ có thể tạo ra một phần thông báo.ascx để xử lý mô-đun. Nhưng tôi thấy rất khó để vượt qua menuitemmodule của tôi và một thực thể thông báo nữa.

Tôi cũng đã nhầm lẫn với việc truyền một đối tượng phức tạp hơn và sau đó kiểm tra mọi Src đi kèm với câu lệnh If. Điều này sẽ làm cho việc mở rộng quy mô trở nên khó khăn trong tương lai khi tôi tăng số lượng các mô-đun có thể có trong ứng dụng.

Tôi làm cách nào để khắc phục sự cố của mình? Tôi hy vọng tôi đã cung cấp đủ thông tin. Tôi thích ý tưởng cơ bản ở đây - http://www.mikesdotnetting.com/Article/105/ASP.NET-MVC-Partial-Views-and-Strongly-Typed-Custom-ViewModels nhưng điều đó dường như chỉ hoạt động đối với các mô-đun tĩnh trên một trang.

Tôi đã thử một mô hình chế độ xem tổng hợp được gọi là ModuleViewModel. Đây là nỗ lực: (. Nhưng tôi phải làm gì đó sai vì một cái gì đó không nhìn bên phải)

public class ModuleViewModel 
{ 
    public IList<Announcements> announcements { get; set; } 
    public IList<MenuItemModule> mods { get; set; } 

} 

Nếu tôi vượt qua mô hình đó đến Item.aspx tôi có thể làm một cái gì đó như thế này

foreach (var mod in Model)   
    { 

     if (mod.announcements.Count > 0) 
     { 
      Html.RenderPartial("Announcements", mod.announcements); 
     } 


    } 

Một lần nữa, khả năng mở rộng sẽ ám ảnh tôi. Tôi muốn có một cái gì đó như thế này trên trang mục:

foreach (var mod in Model)   
    { 

      Html.RenderPartial(mod.Src, mod);   

    } 

Điều đó sẽ xem một phần chính xác và chuyển nó mô hình chính xác.

+0

Bạn đã thử sử dụng 'Html.DisplayFor (...)'? Nó sẽ hiển thị DisplayTemplate khớp với kiểu của thuộc tính. –

+0

Tôi không chắc chắn làm thế nào để làm điều đó. Làm thế nào để nó biết loại mô-đun để sử dụng? – rahkim

+0

Thay vì chuyển Id hoặc chuỗi, bạn sẽ tạo một mô hình xem phức tạp bao gồm tất cả các mô hình khung nhìn cho các mô-đun khác nhau trên trang và sau đó lặp lại chúng gọi DisplayFor để hiển thị chế độ xem một phần thích hợp cho 'Loại' của đối tượng đó. –

Trả lời

0

Sau khi làm rối tung điều này trong hơn một tuần, cuối cùng tôi đã tìm ra cách MVC có thể làm những gì tôi muốn động. Tôi đã quyết định đăng giải pháp của mình cho những người khác mới tham gia MVC. Hy vọng rằng, sau đây sẽ làm sáng tỏ những hiểu lầm tôi có (mặc dù, tại thời điểm này trong sự hiểu biết của tôi về MVC, tôi không thể nói đây là cách tiếp cận tốt nhất.)

Tôi sẽ bao gồm các mã trước snips và sửa đổi cho rõ ràng:

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 : MenuItemModule 
{ 
    private int _ID = -1; 
    private string _Description = string.Empty; 

//get set props ... 
} 

tôi cũng đã thêm một lớp:

public class AnnouncementModule : MenuItemModule 
{ 
    private IList<Announcements> _Announcements; 
    //get set prop 
} 

... và tôi đã tạo ra một mô hình cho xem

public class HomeItemViewModel 
{ 
    public MenuItemModule[] MenuItemModules { get; set; } //collection of menuitemmodules 
} 

Trong điều khiển nhà tôi ...

var menuItemModules = modRepository.GetMenuItemModules(ItemID); 

    if (menuItemModules.Count > 0) 
    { 
     AnnouncementModule aMod; 
     MenuItemModule[] mods = new MenuItemModule[menuItemModules.Count()]; 

     int i = 0; 

     //loop through each MenuItemModule assign to the appropriate model 
     foreach (MenuItemModule mod in menuItemModules) 
     { 
      if (mod.Src == "Announcements") 
      { 
       aMod = new AnnouncementModule(); 
       aMod.Announcements = modRepository.GetAnnouncements(mod.ModuleID); 

       //now add this to the menuitemmodule collection 
       mods[i] = aMod; 
      } 

      if (mod.Src == "Contacts") 
      { 
       //... 
      } 

      i++; 
     } 

    } 


    var viewModel = new HomeItemViewModel 
    { 
     MenuItemModules = mods 
    }; 

    return View(viewModel); 

Sau đó, tôi sử dụng những gợi ý để sử dụng DisplayFor trong giao diện. Chế độ xem được nhập mạnh vào HomeItemViewModel.

<%: Html.DisplayFor(m => m.MenuItemModules) %> 

Điều này lặp qua bộ sưu tập và dựa trên loại, nó sẽ gọi mẫu đó. Trong ví dụ này, nó gọi là Notificationement.ascx được đánh máy mạnh mẽ là NotificationementModule.

foreach (var a in Model.Announcements) 
{ 
    //a.Description will give us the description of the announcement 
} 

Tôi nhận ra có những cách tinh quái để mã điều khiển, và tôi có kế hoạch tái cấu trúc, nhưng bộ xương này sẽ cung cấp những điều cơ bản để giải quyết các câu hỏi tôi đăng.

0

Tạo lớp Module lấy được từ một lớp cơ sở Mô-đun chung:

public class AnnouncementsModule : Module 
{ 
} 

public class ContactsModule : Module 
{ 
} 

Trong điều khiển:

Tạo module khác nhau của bạn và đặt chúng vào mô-đun nhìn tổng thể của bạn (ở đây nó có một tính chất gọi là module đó là một mảng của Module:

var viewModel = new ComplexViewModel 
       { 
        Modules = new [] 
        { 
         new ContactsModule(), 
         new AnnouncementsModule() 
        } 
       }; 
return View(viewModule); 

Theo quan điểm:

@Html.DisplayFor(x => x.Modules); 

Tạo chế độ xem từng phần cho mỗi Type của Mô-đun trong thư mục 'Được chia sẻ' thích hợp. (Chạy nó mà không tạo chúng và nó sẽ cho bạn thấy một ngoại lệ với các vị trí mà nó đang tìm kiếm chúng).

+0

Hãy để tôi thử điều đó. Nó trông rất giống với nỗ lực đầu tiên của tôi, nhưng tôi đã không tạo ra một lớp cơ sở Module. Tôi nghĩ rằng đó có thể là chìa khóa. – rahkim

+0

Câu hỏi nhanh. Những gì hiện các mảng trông giống như trong ComplexViewModel? Nó chỉ là một mô-đun công cộng đơn giản [] Modules {get; bộ;} ? – rahkim

+0

Có, điều đó sẽ hoạt động tốt. –

Các vấn đề liên quan