Devexpress 如何选择为局部视图加载昂贵的视图模型?
DevXPress的PageControl可根据需要加载所选选项卡页面的内容:Devexpress 如何选择为局部视图加载昂贵的视图模型?,devexpress,asp.net-mvc-5,viewmodel,Devexpress,Asp.net Mvc 5,Viewmodel,DevXPress的PageControl可根据需要加载所选选项卡页面的内容: @Model IndexViewModel @Html.DevExpress().PageControl(settings => { settings.TabPages.Add("Dashboard").SetContent(() => { Html.RenderPartial("_Dashboard", ???); }); settings.TabPag
@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) 所有视图和部分共享相同的视图模型,只需传递模型-不幸的是,这意味着控制器必须在每个请求上加载所有页面的所有内容,这太低效了
2) 嵌套单独的视图模型,通过[Child]ViewModel传递模型-效率与(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
}
...
}
settings.TabPages.Add(“仪表板”).SetContent(()=>
{
RenderPartial(“_Dashboard”,Model.CreateDashboardViewModel());
});
settings.TabPages.Add(“查看照片(3)”).SetContent(()=>
{
RenderPartial(“_ReviewPhotos”,Model.CreateReviewPhotosViewModel());
});
...
公共类索引模型
{
public Func CreateDashboardPhotosViewModel{get;set;}
public Func CreateReviewPhotosViewModel{get;set;}
}
...
var viewModel=新索引模型
{
CreateDashboardPhotosViewModel=()=>
{
//加载特定于仪表板的元素
}
...
}
4) 不要直接渲染部分-通过Html.RenderAction(“..”)进行渲染,而是允许在action方法中创建viewmodels。(这是一种可能性,但可能会引起其他问题,因此我有兴趣听取其他选择)
我喜欢(3),但将函数放在视图模型上似乎是一种反模式
我还需要能够为AJAX回调等单独创建这些子视图模型
有没有一种最佳实践方法可以做到这一点?为了记录在案,我们使用了选项(4)-在控制器上调用操作,它可以创建自己的viewmodel