如何最好地在MVC中的布局和内容区域之间共享数据?

时间:2014-03-31 00:01:44

标签: asp.net-mvc asp.net-mvc-4

长期以来,Web Forms开发人员刚接触MVC ......

我正在开发一个电子商务网站。在所有页面共有的标题中,我需要显示有关已登录用户的一些信息(如果有)以及购物车的内容和总数。

页面的其他非常见部分有时也需要其中一些信息。例如,许多页面都需要登录的用户数据,购物车页面和整个结帐过程中都需要购物车数据。

为了最大限度地减少数据库调用,我希望每页检索一次此信息,并在页面的不同部分之间共享。

我知道我可以使用PageData和ViewBag来执行此操作,但更喜欢使用强类型方法。

在Web窗体中,我会让我的母版页检索此信息,并通过公共属性将其访问其他页面。

如何在MVC中做得最好,最好使用布局页面或部分?

更新

我没有意识到视图模型会自动传递到布局页面。

执行以下操作是否是一种好方法:

  1. 使用布局页面
  2. 所需的属性和方法创建接口IPageBase
  3. 创建一个基于类的PageBase,它继承自IPageBase并实现这些属性和方法(即从数据库中检索购物车和用户详细信息)
  4. 为从PageBase继承的每个页面创建一个视图模型
  5. 将页面特定的视图模型传递给控制器​​的视图,并在Layout页面中将模型设置为IPageBase
  6. 这一切似乎运作得很好并且符合我的需要,但是这是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

创建一个包含所需信息的ViewModel,并将其传递给您的视图和部分视图。

示例:

public class CustomerViewModel 
{
    public String UserName { get; set; }
    public DateTime LastLogin { get; set; }
}

不太确定您需要哪些信息,因此我只使用UserNameLastLogin作为示例。

要将ViewModel传递到View,您可以使用重载的Controller.View方法。

return View(customerViewModel);

在您的视图中,您可以使用和访问ViewModel属性,如下所述。

将以下内容添加到视图顶部:

@model ProjectName.Web.Models.CustomerViewModel

并访问以下值:

<h1>Welcome, @Model.UserName</h1>

@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })

答案 1 :(得分:0)

我建议使用Partial Views。通过局部视图将每个部分分开并在何时显示时进行管理。使用零件非常简单:

if(manage_when_it_will_shown)
{
   @Html.Partial("_LogonPartial")
}

您也可以进行数据库调用并显示任何数据。

if(manage_when_it_will_occur)
{
    @Html.Action("Action", "Contoller")
}