Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Devexpress 如何选择为局部视图加载昂贵的视图模型?_Devexpress_Asp.net Mvc 5_Viewmodel - Fatal编程技术网

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

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

DevXPress的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) 所有视图和部分共享相同的视图模型,只需传递模型-不幸的是,这意味着控制器必须在每个请求上加载所有页面的所有内容,这太低效了

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