如何为部分视图选择加载昂贵的视图模型?

时间:2014-08-11 02:04:01

标签: devexpress asp.net-mvc-5 viewmodel

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回调等单独创建这些子视图模型。

这样做有最好的做法吗?

1 个答案:

答案 0 :(得分:1)

为了记录,我们选择了(4) - 在控制器上调用Action,它可以创建自己的viewmodel。