我尝试这样做的主要动机是获得只由页面底部的部分所需的Javascript,以及Javascript的其余部分,而不是呈现部分的页面中间。
下面是我正在尝试做的一个简化示例:
这是正文前面有一个Scripts部分的布局。
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
</head>
<body>
@RenderBody()
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
@RenderSection("Scripts", false)
</body>
</html>
以下是使用此布局的示例视图。
<h2>This is the view</h2>
@{Html.RenderPartial("_Partial");}
@section Scripts {
<script type="text/javascript">
alert("I'm a view.");
</script>
}
这是从视图中渲染的部分。
<p>This is the partial.</p>
@* this never makes it into the rendered page *@
@section Scripts {
<script type="text/javascript">
alert("I'm a partial.");
</script>
}
在此示例中,视图中指定的标记被放置到部分中,而部分中的标记则不被放置。是否可以使用Razor从局部视图填充横断面?如果不是,还有什么其他方法可以获取Javascript,它只需要页面底部的部分代码,而不是全局地包含它?
发布于 2011-11-05 06:08:04
我处理这个问题的方法是为HtmlHelper类编写两个扩展方法。这允许部分视图表明它们需要脚本,然后在布局视图中编写我对助手方法调用的标记,以发出所需的脚本
下面是helper方法:
public static string RequireScript(this HtmlHelper html, string path, int priority = 1)
{
var requiredScripts = HttpContext.Current.Items["RequiredScripts"] as List<ResourceInclude>;
if (requiredScripts == null) HttpContext.Current.Items["RequiredScripts"] = requiredScripts = new List<ResourceInclude>();
if (!requiredScripts.Any(i => i.Path == path)) requiredScripts.Add(new ResourceInclude() { Path = path, Priority = priority });
return null;
}
public static HtmlString EmitRequiredScripts(this HtmlHelper html)
{
var requiredScripts = HttpContext.Current.Items["RequiredScripts"] as List<ResourceInclude>;
if (requiredScripts == null) return null;
StringBuilder sb = new StringBuilder();
foreach (var item in requiredScripts.OrderByDescending(i => i.Priority))
{
sb.AppendFormat("<script src=\"{0}\" type=\"text/javascript\"></script>\n", item.Path);
}
return new HtmlString(sb.ToString());
}
public class ResourceInclude
{
public string Path { get; set; }
public int Priority { get; set; }
}
一旦你准备好了,你的局部视图只需要调用@Html.RequireScript("/Path/To/Script")
。
在布局视图的head部分,调用@Html.EmitRequiredScripts()
。
这样做的一个额外好处是,它允许您消除重复的脚本请求。如果您有多个视图/部分视图需要给定的脚本,那么您可以放心地假设您只会输出它一次
发布于 2011-03-19 01:46:52
分部视图不能参与其父视图的分区。
发布于 2011-03-25 20:46:22
你可以有第二个分部,它只负责注入必要的javascript。如果需要,可以在@if
块周围放置几个脚本:
@model string
@if(Model == "bla") {
<script type="text/javascript">...</script>
}
@else if(Model == "bli") {
<script type="text/javascript">...</script>
}
这显然可以进行一些清理,但是,在视图的Scripts
部分:
@section Scripts
{
@Html.Partial("_Scripts", "ScriptName_For_Partial1")
}
再说一次,它可能不会赢得美容奖,但它会起作用。
https://stackoverflow.com/questions/5355427
复制相似问题