确定在@RenderBody()中呈现的视图是什么。

7
_Layout.cshtml中,是否可能确定将呈现哪个视图在@RenderBody()中?

@AndreiV 假设我有/Home/MyView,我想在_Layout.cshtml中获取"MyView"。 - gsharp
@ShaikhFarooque 不,我实际上想根据视图动态地包含一些 .js。 - gsharp
你想获取正在渲染的视图的名称列表吗? - Andrei V
为什么不直接在该视图上添加.js呢?原则上您的布局页面不应包含任何有关视图的信息。您只需提供一个视图,它将使用<RenderBody>标记进行渲染。 - Yogi
@Yogi 是的,我知道我可以这样做。我只是想知道是否有一种自动化的方法。我有很多视图和每个视图的自定义脚本,不想在每个视图中通过代码行添加引用。 - gsharp
显示剩余3条评论
6个回答

16

您可以通过((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 代替。

Old answer 阅读您的评论,您想要添加

<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包含到view index.cshtml中(以及将detail.js包含到detail.cshtml等等...)而不需要手动输入。我的想法是在_layout.cshtml中放置一段代码来为我完成这项工作... 为此,我需要知道视图... - gsharp
1
我刚刚编辑了我的答案。所以这就是你想要实现的吗? - Matt
我看了@Matt编辑的答案,认为这是最简单的方法。 - Douglas Gandini
是的,这就是它 @Matt。你是我今天的英雄 :-) - gsharp

1
你可以检查 Html.ViewContext.RouteData.Values。这是一个包含控制器、操作和 id(必要时)的字典。

谢谢您的回复。不幸的是,我需要知道视图而不是操作。 - gsharp

0
如果您从一个基础模型派生所有模型,那么您可以在基础模型中添加一个属性,该属性返回控制器名称。您可以使用以下方法获得控制器名称:

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

如果您有一个BaseController类,那就更好了,因为您可以将其放在构造函数中,永远不必再次触及它。

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

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

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


0

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

编辑

RenderBody

什么是RenderBody?

在布局页面中,渲染不在命名部分内的内容页面部分。[MSDN]

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


RenderBody() 没有任何重载方法,因此显然您无法定义要呈现的视图。 - Mohamad Haidar

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视图以呈现其他ViewspartialViews,如下所示添加@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

嗨,Rich。那不行,因为你可以做返回View(“AnotherViewThatDoesntMatchTheActionName”) - gsharp
抱歉,当我阅读问题时,我假设您正在寻找了解默认呈现的视图的详细信息。 - pool pro

0

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

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

布局模板占位符

@RenderSection("scripts", required: false)

查看代码

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

上面的例子说明了custom-imgedit.js将在渲染部分占位符中加载。注意:您甚至可以使用类似@Scripts.Render(“~/bundles/myCustomScripts”)的捆绑包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接