_Layout.cshtml
中,是否可能确定将呈现哪个视图在@RenderBody()
中?_Layout.cshtml
中,是否可能确定将呈现哪个视图在@RenderBody()
中?您可以通过((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
Html.ViewContext.RouteData.Values
。这是一个包含控制器、操作和 id(必要时)的字典。this.RouteData.Values["controller"].ToString();
如果您有一个BaseController
类,那就更好了,因为您可以将其放在构造函数中,永远不必再次触及它。
由于您将返回基本模型的后代到具有控制器名称的索引页面,现在您可以使用一些基于@Model.ControllerName
的方案。如果您的控制器服务于多个视图,则可以更新属性以指示某个视图名称。
我认为除非您使用jquery,否则无法在索引中获取Partial的名称,而此时页面资源已经被加载。
编辑:另一个技巧是创建自己的版本@Html.Partial() HtmlHelper类。所以你有@Html.MyPartial("ViewName"),在该方法内部调用生成Html.Partial的内部函数,然后注入您的依赖项。
阅读this文章,它将解决你的问题。
编辑
RenderBody
什么是RenderBody?
在布局页面中,渲染不在命名部分内的内容页面部分。[MSDN]
RenderBody如何工作(图形展示)?
@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视图以呈现其他Views或partialViews,如下所示添加@Html.Partial("_MyView")
。
@Html.Partial("_LayoutHeaderHeader")
@Html.Partial("_LayoutHeaderNavbar")
@Html.Partial("_MyView")
,这样脚本就会正确设置。编辑:我刚刚阅读了您对该问题的评论,并认为更好的方法是使用@Matt在另一个答案中提供的代码片段。
您可以在视图中使用@section剃刀语句来通知应加载哪个脚本。
布局模板占位符
@RenderSection("scripts", required: false)
查看代码
@section scripts {
<script src="~/Scripts/custom-imgedit.js"></script>
}
上面的例子说明了custom-imgedit.js将在渲染部分占位符中加载。注意:您甚至可以使用类似@Scripts.Render(“~/bundles/myCustomScripts”)的捆绑包。