【问题标题】:Determine what View is going to be rendered in @RenderBody()确定要在 @RenderBody() 中呈现的视图
【发布时间】:2015-06-19 11:32:55
【问题描述】:

_Layout.cshtml 中是否可以确定要在@RenderBody() 中呈现的视图?

【问题讨论】:

  • 您到底需要什么?不太清楚你的意思。
  • 是否要根据某些条件渲染不同的视图?
  • @AndreiV 假设有 /Home/MyView 我想在 _Layout.cshtml 中获取“MyView”
  • @ShaikhFarooque 不,我实际上想根据视图动态包含一些 .js。
  • 您想获取正在呈现的视图的名称列表吗?

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


【解决方案1】:

可以通过((RazorView)ViewContext.View).ViewPath获取View(即Index.cshtml

满足您需求的示例:

<script type="text/javascript" src="~/Content/Scripts/@(Path.GetFileNameWithoutExtension(Server.MapPath(((RazorView)ViewContext.View).ViewPath))).js"></script>

如果您需要实际的视图(即 _Layout.cshtml),您可以改用VirtualPath


旧答案 阅读您的 cmets,您想添加一个

<script ...>...</script>

取决于视图但在@RenderBody() 之外?

然后放

@RenderSection("Scripts", required:false)

并在您的视图中定义类似的部分

@section Scripts {
   <script ...>...</script>
}

因此您不需要维护您的 _Layout.cshtml,因为每个视图都定义了自己的脚本。

这里有一个简单的解释:http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts-and-sections-with-razor

【讨论】:

  • 我知道我可以做到,但这不是我想要的......我只是在尝试如何将 index.js 包含到视图 index.cshtml 中(以及 detail.js 到细节.cshtml 等等..) 无需任何手动输入。我的想法是在 _layout.cshtml 中放置一段代码,这将为我工作......为此我需要知道视图......
  • 我刚刚编辑了我的答案。这就是你想要达到的目标吗?
  • 我阅读了@Matt 编辑的答案并认为这是最简单的方法。
  • 是的,这就是@Matt。你是我今天的英雄:-)
【解决方案2】:

可以做的是检查Html.ViewContext.RouteData.Values。这是一个包含控制器、动作和 id 的字典(根据需要)。

【讨论】:

  • 感谢您的回复。不幸的是,我需要知道 View 而不是 Action。
【解决方案3】:

阅读this 文章,它将解决您的问题。

编辑

渲染体

什么是渲染体?

在布局页面中,呈现内容页面中未显示的部分 在一个命名的部分内。 [MSDN]

RenderBody 的工作原理(图形演示)?

【讨论】:

  • RenderBody() 没有任何重载方法,因此显然您无法定义要渲染的视图。
【解决方案4】:

@RenderBody() 呈现由控制器控制的视图。所以如果你的控制器是这样的。

public class HomeController : Controller
    {
        public ActionResult Index() // Renders File /Views/Home/Index.cshtml
        {
            return View();
        }

    }

然后public ActionResult Index() Index.cshtml 将是它将呈现位于 /Views/Home 文件夹中的视图。

您可以添加到 Index.cshtml_Layout.cshtml 视图以呈现其他 ViewspartialViews通过添加@Html.Partial("_MyView") 如下所示。

        @Html.Partial("_LayoutHeaderHeader")
        @Html.Partial("_LayoutHeaderNavbar")

有时很容易设置几个布局页面以从不同的视图调用。

如果你想调用脚本给你 View,你应该始终创建一个 _PartialView 并将你的脚本放在局部视图中,然后像 @Html.Partial("_MyView") 这样在你的 View 底部调用该 View,这样脚本就会正确设置。

这是一个很好的教程。 http://www.codeproject.com/Articles/698246/ASP-NET-MVC-Special-Views-Partial-View-and-Layout

【讨论】:

  • 嗨,丰富。那是行不通的,因为您可以 return View("AnotherViewThatDoesntMatchTheActionName")
  • 抱歉,当我阅读这个问题时,我认为您正在寻找详细信息以了解默认呈现的视图。
【解决方案5】:

如果您从基础模型派生所有模型,则可以向基础模型添加一个属性,该属性返回控制器名称,您可以使用

this.RouteData.Values["controller"].ToString();

如果你有一个BaseController 类会更好,因为你可以把它放在构造函数中,并且永远不必再碰它。

由于您要将基本模型的后代返回到具有控制器名称的索引页面,现在您可以使用基于@Model.ControllerName 的一些方案。如果您的控制器为多个视图提供服务,则可以更新该属性以指示某个视图名称。

我认为除非您使用 jquery 并且此时页面资源已经加载,否则您无法在索引中获取 Partial 的名称。

编辑: 另一个技巧是创建您自己版本的@Html.Partial() HtmlHelper 类。所以你有 @Html.MyPartial("ViewName") 并在该方法内部调用生成 Html.Partial 的内部函数,然后注入你的依赖项。

【讨论】:

    【解决方案6】:

    编辑:我刚刚阅读了有关该问题的 cmets,并认为更好的方法是使用 @Matt 在另一个答案中提供的代码片段。

    您可以在视图中使用 @section razor 语句来通知应该加载哪个脚本。

    布局模板占位符

    @RenderSection("scripts", required: false)
    

    查看代码

    @section scripts {
        <script src="~/Scripts/custom-imgedit.js"></script>
    }
    

    上面的例子表明 custom-imgedit.js 将被加载到渲染部分的占位符中。注意:你甚至可以使用 @Scripts.Render("~/bundles/myCustomScripts") 之类的包

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 2021-12-11
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多