我正在研究MVC-3 Web应用程序。现在我将其更改为mvc4并将jquery文件放在_Layout页面
的末尾<html>
<head>
</head>
<body>
@Html.Partial("_Menu")
@RenderBody()
@System.Web.Optimization.Scripts.Render("~/jquery")
</body>
</html>
我在部分视图“_Menu”中使用了一些jquery,在Mvc 3中,这工作正常,因为我将jquery文件放在head标签中,但现在我在调用此局部视图时遇到问题
未捕获的ReferenceError:$未定义
我认为这个问题是由于jquery文件正在页面末尾加载。我想到的解决方案是在头标记上加载jquery文件,但我不想这样做。
建议我任何其他解决方案。我如何在局部视图中使用jquery。
谢谢
答案 0 :(得分:2)
您不能在部分视图中使用Section,但您可以编写扩展来执行相同的操作:
public static class ScriptBundleManager
{
private const string Key = "__ScriptBundleManager__";
/// <summary>
/// Call this method from your partials and register your script bundle.
/// </summary>
public static void Register(this HtmlHelper htmlHelper, string scriptBundleName)
{
//using a HashSet to avoid duplicate scripts.
var set = htmlHelper.ViewContext.HttpContext.Items[Key] as HashSet<string>;
if (set == null)
{
set = new HashSet<string>();
htmlHelper.ViewContext.HttpContext.Items[Key] = set;
}
if (!set.Contains(scriptBundleName))
set.Add(scriptBundleName);
}
/// <summary>
/// In the bottom of your HTML document, most likely in the Layout file call this method.
/// </summary>
public static IHtmlString RenderScripts(this HtmlHelper htmlHelper)
{
var set = htmlHelper.ViewContext.HttpContext.Items[Key] as HashSet<string>;
return set != null ? Scripts.RenderFormat("<script type=\"text/javascript\" src=\"{0}\"></script>", set.ToArray()) : MvcHtmlString.Empty;
}
}
然后在_Layout文件中,在脚本包结束后:
@Html.RenderScripts()
然后在局部视图的顶部:
@{Html.Register("~/bundles/group_of_relevant_js_files_for_partial_view");}
然后在定义jQuery之后加载所有必需的功能。
但是:请注意 Kendo js文件需要在使用它们的控件/扩展名之前加载...所以它们总是需要位于布局文件的顶部...这很古怪,但这就是生活... 的
答案 1 :(得分:2)
如果您将jQuery代码放在外部脚本文件中,那么您可以利用defer
元素的script
属性,如下所示:
<script type="text/javascript" src="<path to your .js file>" defer></script>
因此,您的部分视图将包含此脚本标记,并且“defer”会阻止浏览器运行脚本,直到页面加载完毕为止,这意味着jQuery库在执行时将存在。
答案 2 :(得分:1)
如果你总是在_Layout文件中加载菜单并且jQuery应该总是在那里,那么你可以在底部的_Layout页面中编写jQuery代码。
如果您的jQuery使用_Menu中的模型,那么您可以创建一个帮助器,如this
修改强>
如果你按照我提到的链接,它会显示如何在局部视图中定义某种部分,然后在_Layout中渲染这些脚本。
答案 3 :(得分:-3)
在布局文件的末尾添加“脚本”部分,并在包含jQuery之后添加。然后,始终将脚本放入此部分。就是这样。