【问题标题】:Using a Model for Partial Views in a Layout page在布局页面中为局部视图使用模型
【发布时间】:2020-10-18 20:55:39
【问题描述】:

我有一个非常基本的布局文件:

<!DOCTYPE html>

<html lang="en">

    <head></head>
    
    <body>
        @{Html.RenderPartial("/Views/Shared/_Menu.cshtml");}
        @{Html.RenderPartial("/Views/Shared/_Header.cshtml");}
        @{Html.RenderPartial("/Views/Shared/_Footer.cshtml");}
    </body>

</html>

我的问题是菜单、页眉和页脚需要一个模型来加载某种对所有视图都通用的动态数据。

我可以通过将RenderPartial改为RenderAction来解决,例如:

布局:

@{Html.RenderAction("GetFooter", "Layout");}

控制器:

[ChildActionOnly]
public PartialViewResult GetFooter()
{
    FooterViewModel footerViewModel = new FooterViewModel
    {
        // do whatever code is required
    };
    
    return PartialView("/Views/Shared/_Footer.cshtml", footerViewModel);
}

但我读到 RenderAction 是一个很大的禁忌,因为它执行整个 MVC 循环,那么我有什么选择?

【问题讨论】:

  • @Html.Partial() ,允许模型参数
  • 是的,但我的布局没有模型,据我了解,没有与布局链接的 HttpGet 操作,我可以在其中加载动态数据。
  • 您可以使用 ViewData['footerViewModel'] 发送信息来渲染部分
  • 我应该在哪里放置代码来填充 ViewData['footerViewModel']?

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


【解决方案1】:

您可以使用 ViewData['footerViewModel'] 发送信息来渲染部分

控制器

public ActionResult Index()
{
     var footerViewModel = new FooterViewModel
     ...
    ViewData["footerViewModel"] = footerViewModel;
  
    return View();
}

查看

<ul>
@{var m = ViewData["footerViewModel"] as FooterViewModel}

    <li>
        @m.XX
    </li>

</ul>
  • ViewData 将数据从 Controller 传输到 View,反之亦然。
  • ViewData 派生自 ViewDataDictionary,它是一个字典类型。
  • ViewData 的生命周期仅在当前 http 请求期间持续。如果发生重定向,ViewData 值将被清除。
  • ViewData 值必须在使用前进行类型转换。
  • ViewBag 在内部将数据插入到 ViewData 字典中。所以 ViewData 的 key 和 ViewBag 的属性不能匹配。

source

【讨论】:

  • 但这是否意味着我必须在每个控制器操作中进行var footerViewModel = new FooterViewModel 编码?这是很多重复的代码,理想情况下,页脚被加载在一个集中的地方。
  • DRY 原则 => 使用 baseController 或类似的...,stackoverflow.com/questions/50396901/basecontroller-aspcore-mvc,您也可以阅读有关依赖注入的信息
  • 基本控制器听起来不错,我会试试的。
  • 太好了,如果您发现一个明显的问题,请不要忘记将其标记为正确答案或创建一个新问题
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 2019-12-05
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多