首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从部分数据填充Razor部分

从部分数据填充Razor部分
EN

Stack Overflow用户
提问于 2011-03-19 01:06:18
回答 7查看 44.5K关注 0票数 107

我尝试这样做的主要动机是获得只由页面底部的部分所需的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,它只需要页面底部的部分代码,而不是全局地包含它?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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()

这样做的一个额外好处是,它允许您消除重复的脚本请求。如果您有多个视图/部分视图需要给定的脚本,那么您可以放心地假设您只会输出它一次

票数 80
EN

Stack Overflow用户

发布于 2011-03-19 01:46:52

分部视图不能参与其父视图的分区。

票数 29
EN

Stack Overflow用户

发布于 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")
}

再说一次,它可能不会赢得美容奖,但它会起作用。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5355427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档