使用Base ViewModel类而不是@html.action向部分视图提供数据有什么好处?

时间:2016-10-05 14:51:23

标签: c# asp.net-mvc asp.net-mvc-4 partial-views razor-2

我有一个局部视图,我想在具有不同视图模型的多个视图中呈现。有问题的部分视图是作为布局页面的一部分呈现的:

@RenderPage("~/views/shared/_usernavbar.cshtml")

由于父页面上的视图模型不同,每次我只需将我需要的数据放入每个页面的ViewModel中,然后在部分中引用它。

我希望所有内容都保持强类型,因此一种可能的解决方案是创建一个基本视图模型,我将其应用于布局页面并添加到我将在不同页面上使用的各种视图模型。然后我可以在我的部分中引用基本视图模型。但是,我也可以使用@ Html.Action渲染我的部分,然后允许我在我的部分中调用我喜欢的任何视图模型。使用@ Html.Action也意味着我的父视图不需要附加视图模型。

我想知道为什么在这种情况下我会在@ Html.Action上使用基本视图模型?由于两者都需要单独的服务器调用来为我的partial生成数据,因此在基本视图模型上使用@ Html.Action是否有任何缺点?

编辑 - 我尝试尽可能简单地添加示例。

我有一个调用以下ViewModel的视图:

public class CourseViewModel 
    {
        public int CourseID { get; set; }
        public string Title { get; set; }
        public string Country { get; set; }
    }

我有一部分需要以下viewmodel(数据):

public class UserInfoViewModel
{
    public int Stars { get; set; }
    public int XP { get; set; }
    public int Level { get; set; }
}

在父视图中,将调用第一个视图模型:

@model IEnumerable<OLTINT.ViewModels.CourseViewModel>

在布局页面上调用部分视图,如下所示:

@RenderPage("~/views/shared/_usernavbar.cshtml")

实际上,有多个父视图都具有不同的视图模型,在每个视图中我想用视图模型中的数据调用部分视图。我不能简单地将这些数据添加到父视图模型中,因为我在部分视图中调用的模型每次都必须不同。

我认识到两种可能的解决方案,使用上面的基本视图模型或使用@ Html.Action调用部分。

1 个答案:

答案 0 :(得分:0)

阅读评论后

正如Liam所说,Partial更喜欢Action,因为你只需要调用一次服务器。如果您调用Action,则会触发服务器两次(2请求)。使用部分控制器命中一次。

两次使用会导致更多的内存使用,使用更多的数据库连接,通常使用的服务器资源更少的请求吞吐量。

使用您的示例,如果您需要为每个父模型检索UserInfoViewModel数据,它可能会导致您的应用程序对数据库执行N + 1查询(如果您有超过&#的话,这可能会出现问题34;某些&#34;用户或您没有使用缓存)。

更常见的方法可能是仅使用1个或2个查询(一个用于Courses,一个用于所有需要的UserInfo)并在控制器中聚合数据来检索控制器中所需的全部数据。