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.
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. –
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
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 đó. –