DevExpress的PageControl根据需要加载所选标签页的内容:
@Model IndexViewModel
@Html.DevExpress().PageControl(settings =>
{
settings.TabPages.Add("Dashboard").SetContent(() =>
{
Html.RenderPartial("_Dashboard", ???);
});
settings.TabPages.Add("Review photos (3)").SetContent(() =>
{
Html.RenderPartial("_ReviewPhotos", ???);
});
...
}
然而,这使得很难将视图模型传递到每个局部视图中,因为它们各自都有自己的要求。
选项:
1)所有观点& partials共享相同的视图模型,只需传递Model - 不幸的是,控制器必须在每个请求上加载所有页面的所有内容,效率太低
2)嵌套单独的视图模型,传递Model。[Child] ViewModel through - 与(1)相同的低效率
3)在主视图的模型上加载函数,例如:
settings.TabPages.Add("Dashboard").SetContent(() =>
{
Html.RenderPartial("_Dashboard", Model.CreateDashboardViewModel());
});
settings.TabPages.Add("Review photos (3)").SetContent(() =>
{
Html.RenderPartial("_ReviewPhotos", Model.CreateReviewPhotosViewModel());
});
...
public class IndexViewModel
{
public Func<DashboardPhotosViewModel> CreateDashboardPhotosViewModel { get; set; }
public Func<ReviewPhotosViewModel> CreateReviewPhotosViewModel { get; set; }
}
...
var viewModel = new IndexViewModel
{
CreateDashboardPhotosViewModel = () =>
{
//Load dashboard specific elements
}
...
}
4)不要直接渲染部分 - 通过Html.RenderAction(“..”)代替,允许在action方法中创建视图模型。 (这是可能的,但可能会导致其他问题,所以我有兴趣听取替代方案)
我喜欢(3)但是将函数放在视图模型上似乎是一种反模式。
我还需要能够为AJAX回调等单独创建这些子视图模型。
这样做有最好的做法吗?
答案 0 :(得分:1)
为了记录,我们选择了(4) - 在控制器上调用Action,它可以创建自己的viewmodel。