【问题标题】:How to Pass a Partial View To Layout如何将部分视图传递给布局
【发布时间】:2017-03-07 21:37:16
【问题描述】:

这是对我将部分视图传递给布局标题的方法的完整性检查。

在我的布局中,我为每个页面显示了一个导航按钮的位置。

使用该布局的视图模型,我可以将一串数据传递给布局并将其显示在该位置,没问题。

我目前正在构建要在局部视图中显示的导航,然后将其渲染为字符串并通过布局视图模型将其传递到布局中,一切正常。

这是将部分视图传递给布局的常用方法还是有更好的方法?

正如我所说,这工作得非常好,但是渲染 html 以通过字符串传递似乎有点骇人听闻。如果可能的话,能够原生地传递一个局部视图并让它在布局中呈现而不是传递 HTML 会很好。

感谢您提出的建议。

伯爵

【问题讨论】:

  • 不,不是。为什么你不只是在布局中使用Html.Partial("..."),或者如果你需要调用控制器方法来执行一些逻辑,那么Html.Action(...)
  • 如果你打算这样做,只需使用@Html.Partial...
  • 通过模型将部分页面作为html字符串传递的原因是什么?你不能在你的布局页面中使用Html.Partial()来渲染它吗?
  • 大家,谢谢你们的帮助。是的,这是完美的,我认为它会起作用。我确实需要调用局部视图操作,所以我需要使用@html.Action。我唯一的问题是我的每个局部视图操作都传递了不同的数据模型。我可以制作一个包含所有内容的超级模型,并将其传递给我想要在布局中呈现的所有局部视图操作,但这似乎很笨拙。如何使用这种技术将每个局部视图操作方法的确切数据模型传递给布局 html.action 助手?谢谢。
  • 考虑了几分钟后,我有可能使用所有部分视图操作方法数据模型都继承自的基本接口。这个基本接口不需要它自己的任何属性,而是简单地用作载体,允许我将不同的模型传递给控制器​​动作,然后让它们在接收部分视图动作本身中转换回原始类型。只是一个想法。

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


【解决方案1】:

您应该传递局部视图的名称(或实例),并让它内联渲染(因此没有中间字符串分配)。

您应该使用ViewData 进行单向(控制器到视图)数据交换,而不是ViewModel(我认为它应该用于双向数据)。

像这样:

View.cshtml

@model SomeViewModel
@{
    Layout = "Layout.cshtml";

    if( userIsAdmin ) {
        this.ViewData["NavigationPartialName"] = "AdminLinks";
    }
    else {
        this.ViewData["NavigationPartialName"] = "NormalLinks";
    }
}

布局.cshtml:

<nav>
    @{ Html.RenderPartial( this.ViewData["NavigationPartialName"] ); }
</nav>

(注意Html.RenderPartial 通常比Html.Partial 好,因为它直接写入父输出流或缓冲区,而Html.Partial 只返回一个MvcHtmlString,除非你真的需要一个中间字符串,否则效率很低。因为RenderPartial 是一个 void 方法,您需要将其包装在 @{ } 中,而不是更简洁的 @() ,后者需要返回值。

但这可以简化,what-partial-to-display 逻辑可以完全存在于 Layout 文件中:

@{
    Boolean userIsAdmin = this.ViewData["UserIsAdmin"];
}

<nav>
    @{ Html.RenderPartial( userIsAdmin ? "AdminLinks" : "NormalLinks" ); }
</nav>

您可以在控制器中设置this.ViewData["UserIsAdmin"]

class BaseController : Controller {

    protected override void OnResultExecuting(ResultExecutingContext filterContext) {

        this.ViewData["UserIsAdmin"] = this.User.IsInRole("Administrator");
    }
}

如果您不喜欢对 ViewData 使用字典,也可以使用强类型的 ViewData 子类,也可以将 "UserIsAdmin" 键字符串存储为全局常量。

【讨论】:

  • 戴,谢谢你的解释。我可以使用这个版本。很有帮助!!!
猜你喜欢
  • 2016-11-20
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2014-02-05
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多