确定要在@RenderBody()中呈现的视图

时间:2015-06-19 11:32:56

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

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

6 个答案:

答案 0 :(得分:13)

您可以通过((RazorView)ViewContext.View).ViewPath

获取视图(例如 Index.cshtml

满足您需求的示例:

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

如果您需要实际的视图(例如 _Layout.cshtml ),则可以使用VirtualPath代替。

旧答案 阅读您的评论,您想要添加

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

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

然后把

@RenderSection("Scripts", required:false)

并在您的视图中定义类似

的部分
@section Scripts {
   <script ...>...</script>
}

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

以下是一个简单的解释:http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts-and-sections-with-razor

答案 1 :(得分:0)

可以做的是检查Html.ViewContext.RouteData.Values。这是一个带有控制器,动作和id的字典(必要时)。

答案 2 :(得分:0)

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

修改

RenderBody

  

什么是RenderBody?

     

在布局页面中,呈现内容页面中不是的部分   在命名部分内。 [MSDN]

     

RenderBody如何工作(图形演示)?   enter image description here

答案 3 :(得分:0)

@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 视图以呈现其他视图 partialViews 添加@Html.Partial("_MyView"),如下所示。

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

有时可以轻松设置几个布局页面以从不同的视图调用。

如果要向您调用脚本查看,您应该始终创建一个_PartialView并将脚本放在局部视图中,并在视图底部调用该视图@Html.Partial("_MyView"),脚本将正确设置。

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

答案 4 :(得分:0)

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

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

如果你有一个BaseController类会更好,因为你可以将它放在构造函数中,而不必再次触摸它。

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

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

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

答案 5 :(得分:0)

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

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

布局模板占位符

@RenderSection("scripts", required: false)

查看代码

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

上面的示例告知custom-imgedit.js将加载到渲染部分占位符中。注意:您甚至可以使用@ Scripts.Render等捆绑包(&#34;〜/ bundles / myCustomScripts&#34;)