部分之间共享数据

时间:2014-10-07 22:15:23

标签: c# asp.net asp.net-mvc asp.net-mvc-5 asp.net-mvc-partialview

我试图弄清楚在某些部分之间分享一些数据的正确方法,我变得有点迷茫。我会尽力解释设置:

布局

_Layout.cshtml - 这是该网站的主要布局:顶部导航,页脚等。

_SectionLayout.cshtml - 这是_Layout.cshtml的子布局,并使网站的主要内容区域成为标题和两个较低的列 - 左列是菜单,右侧是各种页面内容< / p>

局部模板

_SectionMenu.cshtml - 这是左栏列菜单的标记,它根据预期传递的ViewModel构建菜单,其中包含可枚举的菜单项列表

_SectionHeader.cshtml - 这是节标题的标记,它与上面的菜单类似地构建标题

以上所有内容都位于Shared文件夹中。

一系列控制器使用_SectionLayout样式为具有相关页面的站点区域提供一致的样式。通过每个控制器的_ViewStart.cshtml文件夹中的Views在这些控制器上指定布局。每个控制器为ActionResult_SectionMenu()实现_SectionHeader()方法,为该部分返回适当填充的ViewModel。

菜单加载的各个页面已设置为执行以下操作:

if (Request.IsAjaxRequest())
    return PartialView();
else
    return View();

这样它们既可以直接通过标准GET请求(加载标题,菜单和布局)加载,也可以作为部分插入布局的右侧列。现在这一切似乎都运行良好,直到我决定如何加载在同一个控制器中的动作和部分之间共享的数据,同时尝试在可能的地方坚持DRY并减少代码重用。问题如下:

在此类型的典型控制器中,页面的单个完整加载将调用三个ActionResult方法:_SectionHeader()_SectionMenu()以及主要操作。通常,它们中的所有三个都需要从相同或类似的数据库查询中访问数据。例如,ProductController可能会有一个Index操作,其中会显示产品信息的概述。标题将需要显示产品的名称,菜单将显示图像数量等统计信息。所有这些数据都来自单个查询,它返回数据库中的所有产品信息,但我如何才能最好地在三个操作之间共享此数据?我有过一些想法:

  • 让所有ViewModel从该控制器的基本视图模型继承,并在主操作中打开它后将其传递给部分
  • 将数据存储在ViewBagViewData
  • 只需多次打开数据库,并希望我的ORM足够聪明,意识到它不需要在同一请求中多次从服务器获取它

在我看来,对于一个相当简单的问题,第一个相当复杂。第二个总是感觉像一个便宜的简单出路,我试图避免它。第三,我没有足够的信心,我正在使用的(Dapper)会知道不会再次访问服务器进行相同的查询。

为了使事情变得复杂一些,控制器的一些操作可能不需要加载主数据库查询。要扩展上面的示例,Product控制器菜单中的Images选项可能需要运行一个额外的查询来加载相关图像列表,但如果它被作为ajax调用请求,它实际上不需要加载标题和菜单部分的主查询。

我对此的逻辑感到满意,但是这种类型的控制器中的每一个动作都需要看起来像下面这样,或者可以在这里使用DRY吗?

public ActionResult Images(int? id)
{
    if (!CheckExists(id))
        return HttpNotFound();

    // if this is an action that doesn't normally need the shared data,
    // only load it if it isn't an ajax request, as then the menu/header will require it
    if (!Request.IsAjaxRequest())
        LoadSharedData(); // part of the question is how I handle this part

    // load the particular model for this page
    var model = GetImagesModel();

    if (Request.IsAjaxRequest())
        return PartialView(model);
    else
        return View(model);
}

在一个有10个类似动作的部分中,看到所有极其相似的代码重复告诉我,我做错了什么。在此先感谢您的帮助。如果我没有好好解释,请询问,我会尽力澄清。

0 个答案:

没有答案